2016-10-03 40 views
0

我要让类模板的构造default,如果它是琐碎和默认T,这样的事情:选择类的构造函数

template <typename T> 
class my_class { 
public: 
    template <typename <std::enable_if<std::is_trivially_default_constructible<T>::value, int>::type = 0> 
    constexpr my_class() = default; 

    template <typename <std::enable_if<!std::is_trivially_default_constructible<T>::value, int>::type = 0> 
    constexpr my_class() {}; 
} 

当然,这个代码不工作(空参数,如果条件不满足)。怎么做?

回答

2

可以提供时T是独立的专业化和不平凡的默认constructible:

template <typename T, bool = std::is_trivially_default_constructible<T>::value> 
class my_class { 
public: 
    constexpr my_class() = default; 
}; 

template <typename T> 
class my_class<T, false> { 
public: 
    constexpr my_class() {}; 
}; 
+0

试想一下,'my_class'是一个非常大的类(100+方法),这样做我需要复制所有这些都是专业化? – vladon

+0

@ vladon是的,你会的。无论如何你确定你需要这个吗? 'my_class'中存储了一个'T'类型的对象吗?你是否只在'T'是?时才使'my_class'变得可以构造? – TartanLlama

+0

是的,我在'my_class'中存储'T'类型的对象,并且是的,如果T是简单的默认可构造的,我想使它变得可以默认构造。 – vladon