2016-03-23 60 views
2

我有一個名爲MySet的自定義集合,一個整數應該傳遞給MySet的構造函數來構造它。我想寫一個函數來初始化MySetstd::vector。 我希望這個功能也能夠初始化std::vectorstd::set <int>根據C++模板函數中的typename調用不同的構造函數

類似:

template<typename S> 
void init(std::vector<S> &v, int n){ 
    v.reserve(n); 
    for(int i=0; i<n; i++){ 
     if(std::is_same<S, MySet>::value){ 
      v.push_back(S(42)); 
     } 
     else{ 
      v.push_back(S()); 
     } 
    } 
    return; 
} 

是否有可能解決,而不使用函數重載上init這個問題?

+0

'if(std :: is_same :: value)'不,這不是如何進行元編程。在你的簡單情況下,它可能會起作用,但是當兩個分支不能同時有效時,你會在這裏問爲什麼。 – StoryTeller

+2

您可能對['constexpr if'](http://open-std.org/JTC1/SC22/WG21/docs/papers/2016/p0128r1.html)感興趣,它可能會使它成爲C++ 17和會解決你的問題。 – TartanLlama

+0

@StoryTeller事實上,在這種情況下,我得到了一個錯誤,因爲沒有設置(int) – dacapo1142

回答

3

撰寫製作功能,爲您的類型:

template <class S> 
S create() 
{ 
    return S(); 
} 

template <> 
MySet create<MySet>() 
{ 
    return MySet(42); 
} 


template<typename S> 
void init(std::vector<S> &v, int n){ 
    v.reserve(n); 
    for(int i=0; i<n; i++){ 
     v.push_back(create<S>()); 
    } 
} 
+0

它的工作原理!謝謝! – dacapo1142

+1

@ dacapo1142說「謝謝」的SO方式是[接受](http://stackoverflow.com/help/someone-answers)解決您的問題的答案(每個問題最多接受一個答案)。這標誌着問題已經解決,並給你和回答者一些聲譽。 – Angew

1

如果你的類是拷貝構造,你不需要這個init()函數,只需使用std::vector的構造函數的兩個參數版本:

std::vector<S> v(10, S(42)); 
+1

我相信這不會解決OP的不必區分'S === MySet'和'S === std :: set '。 – Angew

相關問題