我遇到一个问题,即未知代码使用的元模板试图在编译时和运行时取消引用类型。这意味着,它们遍历指针层次结构,直到找到匹配器。
现在通常这很好用。但是当用户传递类似的东西时:
typedef struct _Unknown_* Unknown;
然后它失败了,因为它无法解除引用,即使它是一个有效的指针而不是void*
。
如何检测这种未知大小的结构编译时间并选择不同的代码路径来处理它们,例如不再遍历指针层次结构。
好的我正在寻找的是:
BOOST_STATIC_ASSERT(__is_of_unknown_size__<Unknwon>::value)
,其中__is_of_unknown_size__
是一个对Unknown
或任何其他没有大小的构造求值为true的魔术构造。
由于
答案 0 :(得分:3)
要确定未知大小的类型,您可以使用
#include <type_traits>
template <typename T, typename=void> struct has_size : std::false_type {};
template <typename T>
struct has_size<T, typename std::enable_if<sizeof(T)>::type> : std::true_type {};
Demo。请注意,void
和_Unknown_
在这方面的处理方式相同;它们都是sizeof
运算符不应用的类型([expr.sizeof] / 1)并产生演绎失败。
您还可以为方便起见添加模板
template <typename T>
using pointee_has_size = has_size<typename std::remove_pointer<T>::type>;