2013-05-13 56 views
0

如果我有一个变体包含两种类型 - 结构指针和指向结构的指针向量。如何在boost :: static_visitor中专门处理这两种模板方法来处理这两种情况?模板方法专业化ptr结构和ptr结构的向量?

boost::variant<a*,b*,c*,vector<a*>*, vector<b*>*, vector<c*>*> 
+0

什么是'static_visitor'? – 0x499602D2 2013-05-13 00:55:08

+0

我的意思是boost :: static_visitor。 http://www.boost.org/doc/libs/1_35_0/doc/html/boost/static_visitor.html – 2013-05-13 01:01:11

+0

你有什么试过的?简短的版本“很容易”,但我不知道什么阻止了你。是''b'和'c'具体类,还是占位符?你想让访客做什么? – Yakk 2013-05-13 01:33:01

回答

0

让你的访问者函子继承static_visitor<void>,或者只是typedef void result_type。然后在您的variant中为每种类型重写 - 这可以通过模板或显式重写。

struct my_visitor: static_visitor<void> { 
    void operator()(a*) const { 
    std::cout << "I see an a*\n"; 
    } 
    void operator()(b*) const { 
    std::cout << "I see a b*\n"; 
    } 
    void operator()(c*) const { 
    std::cout << "I see a c*\n"; 
    } 
    void operator()(std::vector<c*>*) const { 
    std::cout << "I see a std::vector<c*>*\n"; 
    } 
    void operator()(std::vector<b*>*) const { 
    std::cout << "I see a std::vector<b*>*\n"; 
    } 
    void operator()(std::vector<a*>*) const { 
    std::cout << "I see a std::vector<a*>*\n"; 
    } 
}; 

顺便说一句,存储在boost::variant原始指针似乎是一个贫穷的想法 - 我想存储智能指针或对象的实例。类似于存储指向std::vector的指针。有用例存储原始指针,但它们并不常见。

一个boost::variant< a, b, c, std::vector<a>, std::vector<b>, std::vector<c> >,或者如果你的类型是多态的接口,std::shared_ptr以相同的(最后我检查boost::variant不移动感知,所以std::unique_ptr不能很好地工作的话)。

想象一下,如果您只是想忽略std::vector实例; struct my_visitor:static_visitor void operator()(a *)const { std :: cout < <“我看到一个a * \ n”; } void operator()(b *)const { std :: cout < <“I see a b * \ n”; } void operator()(c *)const { std :: cout < <“我看到一个c * \ n”; (std :: vector *)const { } template void operator()(std :: vector *)const { std :: cout < <“我看到一个std :: vector * \ n”; } }; 或者,如果你想不顾一切,看起来像一个容器:

// container traits class, detects if `std::begin` and `std::end` work on an instance of the data: 
template<typename C, bool=true> 
struct is_container:std::false_type {}; 
template<typename C> 
struct is_container<C, std::is_same< std::begin(std::declval<C&>()), std::end(std::declval<C&>()) >::value>: 
    std::true_type 
{}; 


struct my_visitor: boost::static_visitor<void> { 
    // blah blah blah 

    // SFINAE detection of C being a container: 
    template<typename C> 
    typename std::enable_if< is_container<C>::value >::type operator()(C*) const { 
    std::cout << "I see a Container<?>*\n"; 
    } 
}; 
在C++编译器11

+0

是否有可能使模板方法专用于“指向结构的指针”,或者您建议“shared_ptr结构”? – 2013-05-13 04:02:48

+0

当然,但是如果你没有这种类型的数据,你打算用这个未知类型的数据做些什么?你只是想忽略'std :: vector *'参数,或者你不在乎'T'的类型是怎么处理它们的? – Yakk 2013-05-13 04:12:05