我怎样才能有可选的默认构造函数?

时间:2009-10-29 23:26:12

标签: c++ traits sfinae

这堂课:

template <class T>
struct A {
  A() : t(T()) {
  } 

  A(const T& t_) : t(t_) {
  }

  T t;
};
如果T没有默认构造函数,

将无法编译。 这一个:

template <class T>
struct A {
  A(const T& t_) : t(t_) {
  }

  T t;
};
即使T具有默认构造函数,

也不会有默认构造函数。

我想要两者兼而有之 - 如果没有T()我不想要A()。

我知道必须使用SFINAE。而Boost.traits和Boost.enable_if可以提供帮助,但我无法让它发挥作用。有人能给我一个这个简单案例的例子吗?

2 个答案:

答案 0 :(得分:1)

类模板的成员函数只有在调用它们时才会被实例化。如果您从不调用A::A(),则不应在此代码中编译调用T::T()的代码:

template <class T>
struct A {
  A() : t(T()) {
  }
  // ...
};

你有这个问题吗?如果是这样,你使用的是哪个编译器?

也就是说,如果使用A的代码调用其默认构造函数,那么我看到的唯一方法是将TA::A()的创建移动到某个traits类中:

template< typename T >
struct default_a_ traits {
  static T default_construct()
  {
    return T();
  }
};

template <class T, class Traits = default_a_traits<T> >
struct A {
  A() : t(Traits::default_construct()) {
  }
  // ...
};

对于没有默认构造函数的类,您可以提供一些traits类,以提供以其他方式创建T的方法:

struct my_special_traits_for_b {
  static T default_construct()
  {
    return read_b_from_db();
  }
};

typedef A<B, special_traits_for_b> AB;

答案 1 :(得分:0)

试试这个:

template <class T>
struct A {
  A(const T& t_ = T()) : t(t_) {
  }

  T t;
};