c++ - 模板类可选地插入初始值作为模板参数

标签 c++ class templates

我目前有一个类相当于:

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++ - 模板类可选地插入初始值作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26954840/

相关文章:

Javascript - 原型(prototype)设计的值(value)是什么?

c++ - Linked template模板参数——约束内参相同

c++ - 重载可变模板成员函数和可变模板函数

c++ - 基于 bool 模板参数的启用方法

java - set 和 get 方法出错

c++ - Visual C++ 2010 快速编译错误

java - 当我使用 java.lang.instrument.Instrumentation#redefineClasses() 时,我应该将数组传递给函数吗?

内置类型的基于 C++ 类型的分派(dispatch)

c++ - 动态数组和运算符重载导致内存崩溃

c++ - 读取 REG_BINARY 会损坏方法的参数