如何检测T类是否至少有1个指针成员?
#include <iostream>
class B{
int k; //no pointer -> false
};
class C{
void* x; //pointer -> true
};
class D{
int someRandom;
C* aBadPractice; //pointer -> true
};
template<class T> bool hasPointer(){ ??
???
};
int main(){
std::cout<<check<B>()<<std::endl; //false
std::cout<<check<C>()<<std::endl; //true
std::cout<<check<D>()<<std::endl; //true
}
我想用它来粗略地检查我的Entity-Component-System中的每种类型的组件是自定义 POD(普通旧数据)。
如果它被违反,它会提醒程序员有关潜在的错误。
我无法使用std::is_pod
因为它的标准与我的标准差别很大。
主要目标/标准: -
B
C
&amp; D
不应该被编辑)B
C
&amp; D
继承公共类。侧面目标: - (不重要)
以下是类似的问题(虽然它们太不相同了): -
我个人认为不可能 类似于&#34的解决方案;这是不可能的&#34;也是一个有效的答案。
我的根本问题是确定我是否可以memcpy
&amp;&amp;省略它们的析构函数。我想轻松安全地重新安置它们 - 就像这样:Can I use memcpy in C++ to copy classes that have no pointers or virtual functions。
现在我认为解决方案是围绕std::is_trivially_destructible
和std::is_trivially_copyable
的解决方案。我会更多地调查他们。我希望他们可以检查我的班级是否包含任何智能指针。
感谢每一条评论。
答案 0 :(得分:3)
is_trivially_copyable
可能是您想要的属性。即使类包含指针,创建浅表副本也是正确的。如果没有,它将必须有一个非平凡的复制构造函数和/或赋值运算符 - 因此不可以轻易地复制。
但是,如果您只是复制或分配 可以轻易复制的对象,编译器很可能会生成类似于memcpy
的代码。通常无需尝试在用户代码中对其进行优化。
同样,如果没有什么可以破坏,则默认析构函数将为空并且优化器将删除一个明确的候选者。例如,考虑内联空析构函数时会发生什么。