C ++ SFINAE和数字转换(强制)

时间:2017-11-29 03:03:35

标签: c++ c++11 templates sfinae

我现在尝试学习SFINAE,但似乎我遇到强制问题,我怎么能让hasRead<Y>hasRead<Z>失败,因为方法参数不对应{ {1}}?

我加入了我的代码,看看可以做些什么让它像我想要的那样工作!

提前致谢:)

std::uint16_t

1 个答案:

答案 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
}

Live

†​​为了迂腐,使用SFINAE in partial specializations is ill-formed in C++11 due to wording defects