今はSFINAEを習得しようとしていますが、強制的に問題があるようですが、std::uint16_t
に対応していないので、hasRead<Y>
とhasRead<Z>
をどうすれば失敗するのですか? ?C++ SFINAEと数値変換(強制)
私のコードに参加して、自分の望むように動作させるために何ができるのか見てみましょう!事前に
感謝:)
#include <cstdint>
#include <iostream>
#include <utility>
template<typename Class>
struct hasRead {
private:
template<typename T>
static constexpr auto check(T *) -> typename std::is_same<
decltype(std::declval<T>().read(std::declval<uint16_t>())), uint8_t>::type;
template<typename>
static constexpr std::false_type check(...);
typedef decltype(check<Class>(0)) type;
public:
static constexpr bool value = type::value;
};
struct X {
uint8_t read(uint16_t x) { return 3; }
};
struct Y {
uint8_t read(uint8_t x) { return 3; }
};
struct Z {
uint8_t read(int64_t x) { return 3; }
};
static_assert(hasRead<X>, "");
static_assert(hasRead<Y>, "");
static_assert(hasRead<Z>, "");
私は、私がもっと簡潔にできるいくつかの研究でこのような解決策を打ち出しました:https://godbolt.org/g/BTzufc – uknys
素晴らしい!非常にシンプルでエレガントです。 – max66