2016-03-23 4 views
2

У меня есть самоопределяемый набор с именем MySet, целое число должно быть передано конструктору MySet для его построения. Я хочу написать функцию для инициализации std::vectorMySet. Я хочу, чтобы эта функция также могла инициализировать std::vectorstd::set <int>.Вызов разных конструкторов на основе typename в функции шаблона C++

что-то вроде:

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

Если ваш класс копирование конструктивно вам не нужна эта функция инициализации(), просто используйте версию два аргумента конструктора std::vector «s:

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

Я считаю, что это не решит OP, чтобы не различать 'S === MySet' и' S === std :: set '. – Angew

Смежные вопросы