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

标签 c++ traits sfinae

这个类:

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/

相关文章:

c++ - Visual Studio 2017 "Object reference not set to an instance of an object."的 cppcheck 插件问题

c++ - 传递 vector 的正确方法是什么?

rust - 为什么 impl trait 不能用于返回多个/条件类型?

c++ - 带有 is_enum 的 enable_if 不起作用

c++ - 管理 MP3 的播放速度和位置

c++ - 如何将 "Bind"数字转换为一串单词/短语,以便我可以在循环中调用它?

rust - 为什么这个特征/实现不兼容 - 绑定(bind)生命周期与具体生命周期

generics - 使用泛型函数制作盒装特征会返回错误

c++ - bool 表达式作为模板参数

c++ - 返回基于参数类的模板迭代器