【发布时间】:2017-12-31 19:10:33
【问题描述】:
我试图检测模板参数中是否存在成员函数baz():
template<typename T, typename = void>
struct ImplementsBaz : public std::false_type { };
template<typename T>
struct ImplementsBaz<T, decltype(&T::baz)> : public std::true_type { };
但它总是产生错误:
struct Foo {};
struct Bar { void baz() {} };
std::cout << ImplementsBaz<Foo>::value << std::endl; // 0
std::cout << ImplementsBaz<Bar>::value << std::endl; // also 0
虽然使用declval 和调用该方法确实有效:
template<typename T>
struct ImplementsBaz<T, decltype(std::declval<T>().baz())> : public std::true_type { };
当然,现在这只能检测到带有 0 个参数的 baz 函数。 为什么使用declval<T>().baz()时正确选择了专业化,而不是decltype(&T::baz)?
【问题讨论】:
-
只是猜测:如果删除通用模板中的默认
= void会发生什么? -
那么
ImplementsBaz<Foo>::value是非法的:too few template arguments -
啊,是的,我确实忽略了这一点。
标签: c++ c++11 template-specialization sfinae member-functions