c++模板函数中根据类型名调用不同的构造函数

Call different constructors based on the typename in c++ template function

我有一个名为MySet的自定义集合,一个整数应该传递给MySet的构造函数来构造它。我想写一个函数来初始化 MySetstd::vector。 我希望这个函数也能够初始化 std::set <int>std::vector

类似于:

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 上不使用函数重载来解决这个问题?

如果您的 class 是可复制构造的,则不需要此 init() 函数,只需使用 std::vector 的构造函数的两个参数版本:

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

为您的类型编写创建者函数:

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>());
    }
}