2013-05-13 54 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