是否检查传递的类型是否是兼容函数?

时间:2013-06-24 05:57:13

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

请考虑以下代码:

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

执行提供的功能。

要使用SFINAE,我想检查该功能是否满足以下条件:

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

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

1 个答案:

答案 0 :(得分:3)

您尚未指定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>

噢。