首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何检查type是否提供了算术类型的函数

如何检查type是否提供了算术类型的函数
EN

Stack Overflow用户
提问于 2015-12-06 13:01:09
回答 1查看 338关注 0票数 3

我想检查模板中提供的类型是否有获取size_t类型和返回算术类型的方法。对于int,它看起来像

代码语言:javascript
运行
复制
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);
};

但是对于所有算术类型,它看起来是什么样子呢?

EN

回答 1

Stack Overflow用户

发布于 2015-12-06 15:12:37

您可以使用现代黑魔法来实现has_something检查:

代码语言:javascript
运行
复制
// 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的存在,检查它不会触发硬编译错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34114256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档