如果我有一个变体包含两种类型 - 结构指针和指向结构的指针向量。如何在boost :: static_visitor中专门处理这两种模板方法来处理这两种情况?模板方法专业化ptr结构和ptr结构的向量?
boost::variant<a*,b*,c*,vector<a*>*, vector<b*>*, vector<c*>*>
如果我有一个变体包含两种类型 - 结构指针和指向结构的指针向量。如何在boost :: static_visitor中专门处理这两种模板方法来处理这两种情况?模板方法专业化ptr结构和ptr结构的向量?
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";
}
};
顺便说一句,存储在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
。
是否有可能使模板方法专用于“指向结构的指针”,或者您建议“shared_ptr结构”? – 2013-05-13 04:02:48
当然,但是如果你没有这种类型的数据,你打算用这个未知类型的数据做些什么?你只是想忽略'std :: vector
什么是'static_visitor'? – 0x499602D2 2013-05-13 00:55:08
我的意思是boost :: static_visitor。 http://www.boost.org/doc/libs/1_35_0/doc/html/boost/static_visitor.html – 2013-05-13 01:01:11
你有什么试过的?简短的版本“很容易”,但我不知道什么阻止了你。是''b'和'c'具体类,还是占位符?你想让访客做什么? – Yakk 2013-05-13 01:33:01