【问题标题】:Check if a class has >=1 pointer field member (unidentified name)检查一个类是否有 >=1 指针字段成员(未识别的名称)
【发布时间】:2017-08-13 12:22:09
【问题描述】:

如何检测一个类 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 中的每种类型的组件是 custom POD(普通旧数据)。

如果违反,它会提醒程序员潜在的错误。

我不能使用std::is_pod,因为它的标准与我的大不相同。

主要目标/标准:-

  • 可能很慢(我不介意性能)。
  • 编译时或运行时检查都可以。
  • 它必须是非侵入式的。 (BC & D 不应编辑)
  • 如果有帮助,可以强制 B C 和 D 从公共类继承。

附带目标:-(不重要)

  • 可以检测私有字段
  • 检测继承的字段
  • 检测一个字段,该字段是其中包含指针的类型

这里有类似的问题(不过它们差别太大了):-

我个人认为这是不可能的。
像“不可能”这样的解决方案也是一个有效的答案。

编辑

我的根本问题是确定我是否可以memcpy && 省略它们的析构函数。我想轻松安全地重新安置它们 - 就像这样:Can I use memcpy in C++ to copy classes that have no pointers or virtual functions。

现在我相信解决方案是围绕std::is_trivially_destructible 和std::is_trivially_copyable。我将进一步调查他们。我希望他们可以检查我的类是否包含任何智能指针。

感谢每一位cmets。

【问题讨论】:

  • @user0042 我已经放了那个链接并澄清了它 - 这个问题是“检查具有 certain name 的字段是否是指针。”和我的不一样。
  • @Ron 我不认为它可以像批处理一样完成(例如std::is_pointer&lt;C&gt; 是错误的)。
  • 这不能在 C++ 中完成。 C++ 不能以这种方式工作。您要解决的真正问题是什么?不,不是确定类 a 是否具有指针成员的问题,而是您认为解决方案是确定类是否具有指针成员的任何问题。
  • 您正在寻找的是在 c++14 中看起来可能的反射,请查看此演讲:youtu.be/abdeAew3gmQ
  • 我个人认为不可能。确实不是。这闻起来很像 XY 问题。

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


【解决方案1】:

is_trivially_copyable 可能是您想要的属性。即使该类包含一个指针,创建一个浅拷贝也可能是正确的。如果不是,它必须有一个非平凡的复制构造函数和/或赋值运算符 - 因此 not 是平凡可复制的。

但是,如果您只是复制或分配一个 可轻易复制的对象,编译器很可能会生成类似于memcpy 的代码。一般不需要在用户代码中尝试优化。

同样,如果没有要销毁的东西,默认析构函数将为空,并且明确的候选者将被优化器删除。例如,考虑内联空析构函数时会发生什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-19
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 2016-07-04
    相关资源
    最近更新 更多