这个类:
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 可以提供帮助,但我无法让它工作。有人可以给我举个这个简单案例的例子吗?
最佳答案
类模板的成员函数只有在您调用它们时才会被实例化。如果您从不调用 A::A()
,则不应在此代码中编译调用 T::T()
的代码:
template <class T>
struct A {
A() : t(T()) {
}
// ...
};
您是否遇到过这样的问题?如果是这样,您使用的是哪个编译器?
也就是说,如果使用 A
的代码调用其默认构造函数,那么我看到的唯一出路是将 T
的创建移动到 A::A()
进入一些特征类:
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;
关于c++ - 我怎样才能有可选的默认构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1647167/