我现在尝试学习SFINAE,但似乎我遇到强制问题,我怎么能让hasRead<Y>
和hasRead<Z>
失败,因为方法参数不对应{ {1}}?
我加入了我的代码,看看可以做些什么让它像我想要的那样工作!
提前致谢:)
std::uint16_t
答案 0 :(得分:2)
我想提供一种更现代的方法来检测成员函数的存在,称为detection idiom。
删节版只需要C ++ 11 †。它更简洁,这样做也能够检测模板成员函数(max66's version没有)。
template<typename T, uint8_t (T::*)(uint16_t) = &T::read>
using detectRead = void;
template<typename, typename = void>
struct hasRead : std::false_type {};
template<typename T>
struct hasRead<T, detectRead<T>> : std::true_type {};
你以同样的方式使用它
struct A { uint8_t read(uint16_t); };
struct B {};
struct C { uint8_t read(uint32_t); };
struct D
{
template<typename T, typename U>
U read(T);
};
void test()
{
static_assert(hasRead<A>::value, ""); // OK
static_assert(hasRead<B>::value, ""); // fails
static_assert(hasRead<C>::value, ""); // fails
static_assert(hasRead<D>::value, ""); // OK
}
†为了迂腐,使用SFINAE in partial specializations is ill-formed in C++11 due to wording defects