我怎样才能有可选的默认构造函数?
问题描述:
这个类:如果T没有默认的构造函数我怎样才能有可选的默认构造函数?
template <class T>
struct A {
A() : t(T()) {
}
A(const 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可以提供帮助,但我无法实现它。有人可以举个例子来说明这个简单的例子吗?
答
试试这个:
template <class T>
struct A {
A(const T& t_ = T()) : t(t_) {
}
T t;
};
答
类模板的成员函数,如果你调用它们只实例化。如果你从来没有调用A::A()
,然后调用T::T()
的代码不应该在此代码编译:
template <class T>
struct A {
A() : t(T()) {
}
// ...
};
你有这个麻烦?如果是这样,你使用的是哪种编译器?
这就是说,如果使用A
代码调用它的默认构造函数,然后我看到的是内A::A()
移动T
创建成一些特性类的唯一出路:
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;
你要A()来对T称,如果T没有默认构造函数是什么? – Mark 2009-10-29 23:42:00
如果没有T(),我完全不需要A()。 – 2009-10-29 23:43:24
我可能会误解,但是您确定第一个失败*,如果您不尝试使用缺省构造函数*的T的默认版本? GCC和Comeau都很好。你如何实例化课堂? – UncleBens 2009-10-29 23:44:45