模板类可以选择将初始值作为模板参数插入
Template class optionally inserting initial values in as template parameter
我目前有一个类,相当于:
template <class T>
class MyContainer
{
public:
MyContainer():
_value()
{
}
T DoSomething();
private:
T _value;
};
我想这样做,以便我可以输入初始值作为模板参数,如下所示:
template <class T> constexpr T GetInital()
{
return 0;
}
template <> constexpr std::string GetInital()
{
return "";
}
template <class T, T initial = GetInital<T>()>
class MyContainer
{
public:
MyContainer():
_value(initial)
{
}
T DoSomething();
private:
T _value;
};
MyContainer<std::string> string_container; // initalized to ""
MyContainer<std::string, "hello"> string_container2; // initalized to hello
MyContainer<int> int_container; // initalized to 0
MyContainer<int, 43> int_container; // initalized to 43
但它不喜欢像 std::string 这样带有"非平凡析构函数"的类。我正在尝试做的事情是可能的,有没有办法解决这个问题。
只需编写一个构造函数重载来执行初始化,这正是它的设计目的。
正如其他人所注意到的,模板参数的每个组合都会生成完全不同的类型。讨论一个可能的解决方案(编译时类型擦除?)对于C++的基本特征之一所涵盖的情况毫无意义:构造函数。
template <class T>
class MyContainer
{
public:
MyContainer():
_value()
{
}
MyContainer(const T& init):
_value(init)
{
}
T DoSomething();
private:
T _value;
};
MyContainer<std::string> string_container; // initalized to ""
MyContainer<std::string> string_container2{"hello"}; // initalized to hello
MyContainer<int> int_container; // initalized to 0
MyContainer<int> int_container{43}; // initalized to 43
如果你想要的是一个实例总是初始化为你指定的值的typedef
,只需编写一个工厂函数:
template<typename T>
auto make_factory( const T& init )
{
return [=](){ return MyContainer<T>{ init }; };
}
int main()
{
auto factory = make_factory<std::string>( "hello" );
auto c1 = factory(); //c1 initialized to hello
auto c2 = factory(); //c2 initialized to hello
}
实际上,make_factory()
是一个工厂的工厂...
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何将字符串作为要插入QStringListModel的参数
- 无法转换字符串插入函数的参数
- C++标准是否保证失败的插入到关联容器中不会修改 rvalue-reference 参数?
- sqlite3 c 函数:插入语句作为参数时未执行
- 二进制搜索树插入带参数参考
- 如何在C 中的LevelDB中的put()方法的值参数中插入多个值
- 为什么我不能在插入的函数调用中直接使用返回的指针作为参数
- 使用按插入方式排序的参数创建哈希映射
- 在 QString 插入函数中使用参数
- 在 LLVM 中,如何插入/声明具有可变参数数量的函数
- sqlite3带有参数的多个插入物;仅插入一个记录
- C++:此插入表达式的作用以及作为函数参数传递时的工作方式
- 将模板参数插入到ostream中
- 在一组模板参数中插入任意数量的类型
- 在矢量中插入元素时,请避免复制参数
- STL 列表插入要求 3 个参数
- 插入>>运算符重载:从 CIN 检索对象的 CTOR 参数时的异常处理
- STL 列表的参数::插入
- 模板类可以选择将初始值作为模板参数插入