gpt4 book ai didi

c++ - 我怎样才能有可选的默认构造函数?

转载 作者:太空狗 更新时间:2023-10-29 23:10:16 25 4
gpt4 key购买 nike

这个类:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com