我有一个模板类,当前有一个不带参数的构造函数。问题是,在某些情况下,模板中使用的类没有空构造函数,这会给出编译错误。
template <typename T>
class A
{
public:
T Thing;
int number;
A():number(5) {}
};
class B
{
public:
int a;
B(int _a):a(_a) {}
}
A<int> a1; // This is fine
A<B> a2; // This is not fine since B has no default constructor
我想过可能会使用添加第二个构造函数来获取T,然后使用enable_if来删除无参数构造函数,如果T没有默认构造函数,但我不确定这是否可行。还有其他选择吗?
请注意,我不想在B类中添加默认构造函数,因为我不想让B的实例处于未知状态。
答案 0 :(得分:0)
向一些人发表意见并做了更多研究并找到了解决方案。 使constexpr静态成员模板化默认构造函数。 这是:
template <typename T>
class A
{
public:
T Thing;
int number;
static constexpr bool HasDefaultConstructors = std::is_default_constructible<T>;
// This removes the default constructor if T does not have one
template<bool HDC = HasDefaultConstructors, typename std::enable_if<HDC, int>::type = 0>
A():number(5) {}
A(const Thing &t):T(t) {}
};