有没有办法检查是否class
有typedef
哪个有效private
typedef
?
以下代码适用于VS2013,但在ideone的gcc上失败
templatestruct to_void { typedef void type; }; class Foo { typedef int TD; }; template struct has_TD : std::false_type {}; template struct has_TD ::type > : std::true_type{}; int main() { std::cout << std::boolalpha << has_TD ::value << std::endl; }
编辑 - 为什么我想要这个
我有自定义序列化系统,可以序列化任意类型.当它必须表现不同时(例如字符串),它有几个重载.对于其余类型,它只是将值写入内存中.如果我有编写类型,我有时也可以写入内存(保存和加载发生在同一架构上,使用相同的编译器编译,因此填充将是相同的,等等).此方法对于POD类型(std::is_pod
特征)有效,但所有POD类型仅是所有类型的子集,支持此序列化.
所以我基本上都有模板化的函数write
,它只是写sizeof(T)
字节(原始序列化)...但是我不希望这个被错误地调用,我想要用户,在他们的类中明确地说:"这个类/结构可以是原始的序列化过").我这样做的方法是ALLOW_RAW_SERIALIZE
定义一些可以通过trait检查的typedef 的宏.如果类MyClass
不包含typedef,则调用write(myClassInstance)
将产生编译器错误.
基本决定类是否可以原始序列化的东西是它的成员(没有反射,成员不能自动枚举和检查,因此用户必须提供这样的信息).典型的类看起来像这样:
class public ctor-dtor methods private methods members
我希望用户允许写入ALLOW_RAW_SERIALIZE
尽可能接近成员,所以当他们更改某些成员时,忘记更新的可能性较小ALLOW_RAW_SERIALIZE
(删除它.当它不再有效时)
所以这就是我想检查的原因 private typedef
因为它可以代替反射并采用整体类型并编写它,所以我不会像打破封装那样堕落......