如果我有一个包含两种类型的变体——指向结构的指针和指向结构的指针向量。如何专门化 boost::static_visitor 中的两个模板方法来处理这两种情况?
boost::variant<a*,b*,c*,vector<a*>*, vector<b*>*, vector<c*>*>
如果我有一个包含两种类型的变体——指向结构的指针和指向结构的指针向量。如何专门化 boost::static_visitor 中的两个模板方法来处理这两种情况?
boost::variant<a*,b*,c*,vector<a*>*, vector<b*>*, vector<c*>*>
让您的访问者函子继承自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";
}
};
顺便说一句,在 a 中存储原始指针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 << "我看到一个 a*\n"; } void operator()( b* ) const { std::cout << "我看到 ab*\n"; } void operator()( c* ) const { std::cout << "我看到 ac*\n"; } 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 编译器中。