我有一个名为has_f
我希望它只接受具有以下内容的模板参数f
成员函数。我该怎么做呢?这是我尝试过的:
template <typename T, typename = void>
struct has_f : std::false_type {};
template <typename T>
struct has_f<
T,
typename = typename std::enable_if<
typename T::f
>::type
> : std::true_type {};
但我遇到了一些神秘的错误。这是我想使用的类:
struct A
{
void f();
};
我该如何正确地做到这一点?谢谢。
从你的问题的标题来看,我认为你并不真正需要从 true_type 或 false_type 派生的类型 - 只是为了在方法 f 不存在时防止编译。如果是这种情况,并且您还需要该方法的特定签名(至少在参数方面),则在 C++11 中您可以执行以下操作:
template <typename T>
struct compile_if_has_f
{
static const size_t dummy = sizeof(
std::add_pointer< decltype(((T*)nullptr)->f()) >::type );
};
这是针对 f() 不应接受任何参数的情况。仅当 f 返回 void 时才需要 std::add_pointer,因为 sizeof(void) 是非法的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)