我试图检测模板参数的成员函数baz()
的存在:为什么decltype(declval <T>().func())在decltype(&T :: func)不工作的地方工作?
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 { };
当然,现在这可以onl y检测具有0个参数的baz
函数。 为什么在使用declval<T>().baz()
而不是decltype(&T::baz)
时正确选择了专业化?
只是一个猜测:如果删除的通用模板默认''= void''会发生什么? – bjhend
然后'ImplementsBaz :: value'是非法的:'太少模板arguments' –
jtbandes
啊,是的,我确实忽略了。 – bjhend