我想检查模板中提供的类型是否有获取size_t类型和返回算术类型的方法。对于int,它看起来像
template <typename U>
struct has<U> {
template <typename T, T>
struct helper;
template <typename T>
static std::uint8_t check(helper<int (*)(size_t), &T::function_name>*);
template <typename T>
static std::uint16_t check(...);
static constexpr bool value = sizeof(check<U>(0)) == sizeof(std::uint8_t);
};
但是对于所有算术类型,它看起来是什么样子呢?
发布于 2015-12-06 15:12:37
您可以使用现代黑魔法来实现has_something检查:
// Stolen from C++17 std::
template<typename...> using void_t = void;
template<typename T, typename = void_t<>>
struct has: std::integral_constant<bool, false> {
};
template<typename T>
struct has<T, void_t<decltype(T::function_name(std::declval<std::size_t>()))>>:
std::is_arithmetic<decltype(T::function_name(std::declval<std::size_t>()))> {
};
这里的想法是,当void_t
中的内容有效时,部分专门化更好(更专业)。否则,将使用常规默认值。在这里,我把所有的T
都拆分成用一个size_t
参数调用T::function_name
的可能性。之后,我对那个调用的返回类型做了额外的is_arithmetic
检查。你可能会发现这个检查仍然有点宽松:function_name(float)
会通过它,因为size_t
值可以隐式地转换成float
。你可以很容易地用额外的检查填充部分专门化,因为你知道function_name
的存在,检查它不会触发硬编译错误。
https://stackoverflow.com/questions/34114256
复制相似问题