如何检测 class 在 C++ 中是否具有隐式构造函数和原始成员?
How can I detect whether a class has an implicit constructor AND primitive members in c++?
我想在编译时(静态断言)检测一个 class 是否满足以下两个条件:
- 具有隐式默认构造函数(即没有用户定义的默认构造函数)。
- 至少有一个数据成员是 pod(即默认初始化为假定其内存地址中的任何随机字节的成员)。
[我希望我在这里正确使用术语 pod]
我们的想法是避免使用具有未初始化成员的对象。我知道在编码过程中有不同的方法可以做到这一点,但我也想要一种在编译过程中检测到这一点的机制。
我尝试使用不同的 std/boost 函数,例如 is_trivially_constructible、is_pod,但其中的 none 提供了我需要的确切术语。
例如,假设我有以下 classes:
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
首先,在我看来,期望 class 的用户关心其成员初始化是一个糟糕的设计。您应该确保 class 本身的所有成员都已初始化,而不是在其他使用它的地方。
你要找的东西不存在,即使存在,也帮不了你。显式构造函数的存在并不能保证数据成员被初始化。另一方面,使用 C++11 甚至可以在不显式编写构造函数的情况下初始化数据成员(在 class 声明中使用大括号语法)。另外,您似乎只关心未初始化的 POD 成员,但是未初始化的 non-POD 成员呢?
也就是说,编译器可以生成有关未初始化值的警告,但通常您必须启用此警告(例如 gcc 的 -Wuninitialized 选项)。大多数编译器允许强制将警告视为错误。结合起来,即使没有专门编写代码来测试它,它也可以为您提供所需的效果,并且它也适用于任何未初始化的值,而不仅仅是 classes 中的值。也许这就是您正在寻找的解决方案。
我想在编译时(静态断言)检测一个 class 是否满足以下两个条件:
- 具有隐式默认构造函数(即没有用户定义的默认构造函数)。
- 至少有一个数据成员是 pod(即默认初始化为假定其内存地址中的任何随机字节的成员)。 [我希望我在这里正确使用术语 pod]
我们的想法是避免使用具有未初始化成员的对象。我知道在编码过程中有不同的方法可以做到这一点,但我也想要一种在编译过程中检测到这一点的机制。 我尝试使用不同的 std/boost 函数,例如 is_trivially_constructible、is_pod,但其中的 none 提供了我需要的确切术语。
例如,假设我有以下 classes:
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
首先,在我看来,期望 class 的用户关心其成员初始化是一个糟糕的设计。您应该确保 class 本身的所有成员都已初始化,而不是在其他使用它的地方。
你要找的东西不存在,即使存在,也帮不了你。显式构造函数的存在并不能保证数据成员被初始化。另一方面,使用 C++11 甚至可以在不显式编写构造函数的情况下初始化数据成员(在 class 声明中使用大括号语法)。另外,您似乎只关心未初始化的 POD 成员,但是未初始化的 non-POD 成员呢?
也就是说,编译器可以生成有关未初始化值的警告,但通常您必须启用此警告(例如 gcc 的 -Wuninitialized 选项)。大多数编译器允许强制将警告视为错误。结合起来,即使没有专门编写代码来测试它,它也可以为您提供所需的效果,并且它也适用于任何未初始化的值,而不仅仅是 classes 中的值。也许这就是您正在寻找的解决方案。