这堂课:
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可以提供帮助,但我无法让它发挥作用。有人能给我一个这个简单案例的例子吗?
答案 0 :(得分:1)
类模板的成员函数只有在调用它们时才会被实例化。如果您从不调用A::A()
,则不应在此代码中编译调用T::T()
的代码:
template <class T>
struct A {
A() : t(T()) {
}
// ...
};
你有这个问题吗?如果是这样,你使用的是哪个编译器?
也就是说,如果使用A
的代码调用其默认构造函数,那么我看到的唯一方法是将T
中A::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;
};