如果我有一個變體包含兩種類型 - 結構指針和指向結構的指針向量。如何在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