c++模板函数中根据类型名调用不同的构造函数
Call different constructors based on the typename in c++ template function
我有一个名为MySet
的自定义集合,一个整数应该传递给MySet
的构造函数来构造它。我想写一个函数来初始化 MySet
的 std::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>());
}
}
我有一个名为MySet
的自定义集合,一个整数应该传递给MySet
的构造函数来构造它。我想写一个函数来初始化 MySet
的 std::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>());
}
}