2015-04-02 158 views
2

對於Foo類型,我想在boost::variant中使用,我想將默認構造函數設置爲private,因爲它只能被boost::variant調用。boost :: variant作爲朋友類

可悲的是我還沒能弄清楚的boost::variant聲明魔術和簡單的聲明

struct Foo { 
private: 
    Foo(); 
    template <class T1, class T2> 
    friend class boost::variant<T1, T2>; 
}; 

沒有任何編譯。有沒有辦法做到這一點,或者我需要保留Foo()public

回答

3

boost::variant的模板參數的數量由BOOST_VARIANT_LIMIT_TYPES給出。你可以通過利用Boost.Preprocessor使用它:

#include "boost/preprocessor/repetition/enum_params.hpp" 

struct Foo { 
private: 
    Foo(); 

    template <BOOST_PP_ENUM_PARAMS(BOOST_VARIANT_LIMIT_TYPES, class T)> 
    friend class boost::variant; 
}; 

boost::variant被聲明爲BOOST_VARIANT_LIMIT_TYPES模板參數的類模板,所以你必須把它稱爲這樣。這是BOOST_PP_ENUM_PARAMS(a, b)的工作,它擴展爲一個由a逗號分隔的項目列表,其中每個項目都是b,並附有一個唯一編號。例如,

BOOST_PP_ENUM_PARAMS(5, class T) 

將擴大到:

class T0, class T1, class T2, class T3, class T4 
+1

我覺得這沒有保證實體化代碼'提振:: variant'本身,而不是它的輔助類之一。但我沒有看過執行。也許它是文檔界面的一部分。 – 2015-04-02 09:51:38

+0

@ Cheersandhth.-Alf好點。我回答了「如何結合boost :: variant',」不是更廣泛的「如何使用'boost :: variant'的私有ctor。」我會把它留給OP來判斷它是否適用於他們;我願意通過更好的答案來解決問題,並且/或者在發現問題的情況下撤回我的答案。 – Angew 2015-04-02 09:54:19

+0

我檢查了'boost :: variant'的實例化,之前:)。也就是說,該提議至少會在標識符爲'BOOST_PP_REPEAT_1_class'的VS2010上引發語法錯誤。 – abergmeier 2015-04-02 10:30:29