У меня есть самоопределяемый набор с именем MySet
, целое число должно быть передано конструктору MySet
для его построения. Я хочу написать функцию для инициализации std::vector
MySet
. Я хочу, чтобы эта функция также могла инициализировать std::vector
std::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
?
'if (std :: is_same
:: value)' Нет, это не так, как выполняется метапрограммирование. В вашем простом случае это может сработать, но когда оба филиала не могут быть действительными одновременно, вы будете здесь спрашивать, почему. – StoryTellerВозможно, вас заинтересует ['constexpr if'] (http://open-std.org/JTC1/SC22/WG21/docs/papers/2016/p0128r1.html), который может попасть в C++ 17 и решит вашу проблему. – TartanLlama
@StoryTeller На самом деле, я получил ошибку в этом случае, так как не существует (int) –
dacapo1142