检查一个类是否有> = 1指针字段成员(未识别的名称)

时间:2017-08-13 12:22:09

标签: c++ templates pointers c++14

如何检测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_destructiblestd::is_trivially_copyable的解决方案。我会更多地调查他们。我希望他们可以检查我的班级是否包含任何智能指针。

感谢每一条评论。

1 个答案:

答案 0 :(得分:3)

is_trivially_copyable可能是您想要的属性。即使类包含指针,创建浅表副本也是正确的。如果没有,它将必须有一个非平凡的复制构造函数和/或赋值运算符 - 因此可以轻易地复制。

但是,如果您只是复制或分配 可以轻易复制的对象,编译器很可能会生成类似于memcpy的代码。通常无需尝试在用户代码中对其进行优化。

同样,如果没有什么可以破坏,则默认析构函数将为空并且优化器将删除一个明确的候选者。例如,考虑内联空析构函数时会发生什么。