【发布时间】: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不应编辑) - 如果有帮助,可以强制
BC和D从公共类继承。
附带目标:-(不重要)
- 可以检测私有字段
- 检测继承的字段
- 检测一个字段,该字段是其中包含指针的类型
这里有类似的问题(不过它们差别太大了):-
- Check if a class has a member function of a given signature :具有特定名称和签名 的搜索功能
- Check if a class has a pointer data member :检查具有某个名称的字段是否为指针。
我个人认为这是不可能的。
像“不可能”这样的解决方案也是一个有效的答案。
编辑
我的根本问题是确定我是否可以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<C>是错误的)。 -
这不能在 C++ 中完成。 C++ 不能以这种方式工作。您要解决的真正问题是什么?不,不是确定类 a 是否具有指针成员的问题,而是您认为解决方案是确定类是否具有指针成员的任何问题。
-
您正在寻找的是在 c++14 中看起来可能的反射,请查看此演讲:youtu.be/abdeAew3gmQ
-
我个人认为不可能。确实不是。这闻起来很像 XY 问题。
标签: c++ templates pointers c++14