【问题标题】: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>
哇哦。