没有默认构造函数的模板的构造函数

时间:2017-11-16 03:19:22

标签: c++ templates

我有一个模板类,当前有一个不带参数的构造函数。问题是,在某些情况下,模板中使用的类没有空构造函数,这会给出编译错误。

template <typename T>
class A
{
     public:
     T Thing;
     int number;
     A():number(5) {}
 };


  class B
  {
       public:
       int a;
       B(int _a):a(_a) {}
  }

  A<int> a1; // This is fine
  A<B> a2; // This is not fine since B has no default constructor

我想过可能会使用添加第二个构造函数来获取T,然后使用enable_if来删除无参数构造函数,如果T没有默认构造函数,但我不确定这是否可行。还有其他选择吗?

请注意,我不想在B类中添加默认构造函数,因为我不想让B的实例处于未知状态。

1 个答案:

答案 0 :(得分:0)

向一些人发表意见并做了更多研究并找到了解决方案。 使constexpr静态成员模板化默认构造函数。 这是:

template <typename T>
class A
{
public:
     T Thing;
     int number;
     static constexpr bool HasDefaultConstructors = std::is_default_constructible<T>;

     // This removes the default constructor if T does not have one
     template<bool HDC = HasDefaultConstructors, typename std::enable_if<HDC, int>::type = 0>
     A():number(5) {}

     A(const Thing &t):T(t) {}
 };