c – 使用`void_t`检查类是否具有特定签名的方法

前端之家收集整理的这篇文章主要介绍了c – 使用`void_t`检查类是否具有特定签名的方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
目前,我是 using this method to check if a class has a method with a specific signature.

在参加了Walter E. Brown’s metaprogramming CppCon2014 talk之后,我开始想知道在这种特殊情况下是否可以使用void_t来使代码更清晰,更具可读性.

但是我在使用void_t方面遇到了麻烦 – 到目前为止我理解void_t可以帮助我在编译时确定表达式是否有效.

例:

template< class,class = void >
struct has_type_data_member : false_type { };

template< class T >
struct has_type_data_member<T,void_t<decltype(T::data)>> : true_type { };

如果decltype(T :: type)是有效表达式,则has_type_data_member< T>将是一个真正的编译时常量.因此,我们确信T有一个名为data的成员字段.

我想使用相同的方法来检查类型T是否具有特定名称和特定签名的方法.

假设我想检查T是否有一个名为getCount()的方法返回int.这是我期望的工作((Ideone.com link))

template< class,class = void >
struct hasGetCount : false_type { };

template< class T >
struct hasGetCount<T,VoidT<decltype(T::getCount)>> 
: std::is_same<decltype(std::declval<T>().getCount()),int>::type { };

不幸的是,static_assert测试没有通过.

我究竟做错了什么?在这种情况下是否可以使用void_t?

奖金问题:

>我如何检查方法签名是否等于用户在原始实现中传递的签名?
>我可以使用宏来定义这样的辅助结构,如下所示:

DEFINE_METHOD_CHECKER(hasGetCount,getCount);
 // ...
 static_assert(hasGetCount<ClassWithGetCount>::value == true,"");

是否可以避免必须首先定义结构然后检查结构的值?我的意思是,是否可以使用宏来编写这样的东西?例:

static_assert(CHECK_METHOD(ClassWithGetCount,getCount)::value == true,"");

解决方法

首先,命名非静态成员函数的id-expression不能用作未评估的操作数(例如decltype的操作数).此外,您应该检查整个函数调用表达式是否格式正确,而不仅仅是否有一个名为getCount的成员:
template< class,VoidT<decltype(std::declval<T>().getCount())>> 
: std::is_same<decltype(std::declval<T>().getCount()),int>::type { };

(如果要检查是否可以在左值上调用getCount(),请使用declval< T&&gt ;.) 如果您只是检查是否存在getCount成员,那么如果具有该名称的成员存在但不可调用(例如,数据成员),则会出现硬错误. 虽然在这一点上你也可以考虑使用类似的东西

template< class T >
struct hasGetCount<T,std::enable_if_t<std::is_same<decltype(std::declval<T>().getCount()),int>::value>> : std::true_type { };

而不是两次写decltype.

原文链接:https://www.f2er.com/c/114425.html

猜你在找的C&C++相关文章