如果我有一个变量包含两个类型 - 指向struct的指针,以及指向struct的指针的向量。我如何专门设计boost :: static_visitor中的两个模板方法来处理这两种情况?
boost::variant<a*,b*,c*,vector<a*>*, vector<b*>*, vector<c*>*>
答案 0 :(得分: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
的指针。有一些用例来存储原始指针,但它们并不常见。
A 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&lt;&lt; “我看到一个* \ n”;
}
void operator()(b *)const {
std :: cout&lt;&lt; “我看到了一个b * \ n”;
}
void operator()(c *)const {
std :: cout&lt;&lt; “我看到了一个c * \ n”;
}
模板
void operator()(std :: vector *)const {
std :: cout&lt;&lt; “我看到一个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编译器中。