我想在编译时(静态断言)检测类是否同时满足以下两个条件:
这个想法是避免使用带有未初始化成员的对象。我知道在编码过程中可以有不同的方法来执行此操作,但是我还需要一种在编译过程中检测到此问题的机制。 我尝试使用不同的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
答案 0 :(得分:2)
首先,在我看来,期望类的用户关心其成员初始化的设计很糟糕。您应该在类本身中确保其所有成员都已初始化,而不是在使用它的其他位置进行了初始化。
您要找的东西不存在,如果可以找到,它甚至对您也没有帮助。显式构造函数的存在并不能保证数据成员已初始化。另一方面,使用C ++ 11,甚至可以在不显式编写构造函数的情况下初始化数据成员(使用类声明中的大括号语法)。另外,您似乎只在乎未初始化的POD成员,但是未初始化的非POD成员呢?
也就是说,编译器可以生成有关未初始化值的警告,但是通常您必须启用此警告(例如,gcc的-Wuninitialized选项)。大多数编译器允许强制将警告视为错误。结合起来,即使没有专门编写代码对其进行测试,也可以达到预期的效果,并且它还适用于任何未初始化的值,不仅适用于类中的值。也许这就是您要寻找的解决方案。