2009-10-29 102 views
3

这个类:如果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可以提供帮助,但我无法实现它。有人可以举个例子来说明这个简单的例子吗?

+0

你要A()来对T称,如果T没有默认构造函数是什么? – Mark 2009-10-29 23:42:00

+0

如果没有T(),我完全不需要A()。 – 2009-10-29 23:43:24

+4

我可能会误解,但是您确定第一个失败*,如果您不尝试使用缺省构造函数*的T的默认版本? GCC和Comeau都很好。你如何实例化课堂? – UncleBens 2009-10-29 23:44:45

回答

0

试试这个:

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

    T t; 
}; 
1

类模板的成员函数,如果你调用它们只实例化。如果你从来没有调用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; 
相关问题