此刻,我是使用此方法检查类是否具有具有特定签名的方法。
参加后Walter E. Brown 的元编程 CppCon2014 演讲,我开始想知道是否void_t
可以在这种特殊情况下使用,以使代码更清晰、更具可读性。
但是我很难思考void_t
- 到目前为止我明白了void_t
可以帮助我在编译时确定表达式是否有效。
Example:
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 { };
If decltype(T::type)
是一个有效的表达式,has_type_data_member<T>
将是一个真正的编译时常量。因此,我们确信T
有一个名为的成员字段data
.
我想使用相同的方法来检查类型是否T
有一个具有特定名称和特定签名的方法。
假设我想检查是否T
有一个方法叫做getCount()
返回int
。这就是我期望的工作((Ideone.com 链接)):
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, "");
是否可以避免定义一个struct
首先然后检查结构的值?我的意思是,是否可以使用宏来编写这样的东西?例子:
static_assert(CHECK_METHOD(ClassWithGetCount, getCount)::value == true, "");