如何在C ++中检测类是否具有隐式构造函数和原始成员?

时间:2019-06-26 14:10:10

标签: c++ constructor primitive-types default-constructor implicit-constructor

我想在编译时(静态断言)检测类是否同时满足以下两个条件:

  • 具有隐式默认构造函数(即,没有用户定义的默认构造函数)。
  • 至少有一个作为Pod的数据成员(即默认初始化是假设其内存地址中包含任意随机字节的成员)。 [希望我在这里正确使用了术语“荚”]

这个想法是避免使用带有未初始化成员的对象。我知道在编码过程中可以有不同的方法来执行此操作,但是我还需要一种在编译过程中检测到此问题的机制。 我尝试使用不同的std / boost函数,例如is_trivially_constructible,is_pod,但是这些函数都不提供我需要的确切术语。

例如,假设我有以下课程:

struct A
{
  int a;
}

struct B
{
  int* b;
}

struct C
{
  bool c;
  std::string c_str_; 
}

struct D
{
  D();
  float d; 
}

struct E
{
  std::string e;
}

假设我需要的函数称为“ has_primitive_and_implicit_ctor”,我希望每个调用的输出与注释中的一样:

has_primitive_and_implicit_ctor<A>(); //true - A has at least one pod type member (int)
has_primitive_and_implicit_ctor<B>(); //true - A has at least one pod type member (pointer)
has_primitive_and_implicit_ctor<C>(); //true - A has at least one pod type member (bool), even though there is one non-pod member
has_primitive_and_implicit_ctor<D>(); //false - has a pod member(float), but a user defined ctor
has_primitive_and_implicit_ctor<E>(); //false - doesn't have a default ctor but has no pod members

1 个答案:

答案 0 :(得分:2)

首先,在我看来,期望类的用户关心其成员初始化的设计很糟糕。您应该在类本身中确保其所有成员都已初始化,而不是在使用它的其他位置进行了初始化。

您要找的东西不存在,如果可以找到,它甚至对您也没有帮助。显式构造函数的存在并不能保证数据成员已初始化。另一方面,使用C ++ 11,甚至可以在不显式编写构造函数的情况下初始化数据成员(使用类声明中的大括号语法)。另外,您似乎只在乎未初始化的POD成员,但是未初始化的非POD成员呢?

也就是说,编译器可以生成有关未初始化值的警告,但是通常您必须启用此警告(例如,gcc的-Wuninitialized选项)。大多数编译器允许强制将警告视为错误。结合起来,即使没有专门编写代码对其进行测试,也可以达到预期的效果,并且它还适用于任何未初始化的值,不仅适用于类中的值。也许这就是您要寻找的解决方案。