【问题标题】:Enable if to check whether the passed type is a compliant function?启用 if 以检查传递的类型是否为兼容函数?
【发布时间】:2013-06-24 05:57:13
【问题描述】:

考虑以下代码:

template <class Function, class = typename std::enable_if</*SOMETHING*/>::type>
apply(Function&& f);

执行提供的功能。

要使用SFINAE,我想检查函数是否满足以下条件:

  • 它需要一个可转换为const unsigned int的参数
  • 它返回可转换为std::string 的东西

我要写什么而不是/*SOMETHING*/

【问题讨论】:

    标签: templates c++11 template-meta-programming typetraits enable-if


    【解决方案1】:

    你还没有为apply指定返回值,我选择int

    #include <string>
    #include <type_traits>
    
    template <class Function,
      class = typename std::enable_if<
        std::is_convertible<
          decltype(std::declval<Function>()(std::declval<const unsigned int>())),std::string>::value>::type>
    int apply(Function&& f);
    

    分解:这可以确保Function:

    std::declval<Function>()
    

    使用const unsigned int 参数调用:

    std::declval<Function()(std::declval<const unsigned int>())
    

    有一个返回类型:

    decltype(std::declval<Function()(std::declval<const unsigned int>()))
    

    可转换为std::string:

    std::is_convertible<decltype(std::declval<Function()(std::declval<const unsigned int>())), std::string>
    

    哇哦。

    【讨论】:

      猜你喜欢
      • 2018-07-19
      • 2022-11-16
      • 2011-08-25
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2012-08-19
      相关资源
      最近更新 更多