c++ - c++ 如何定义一个 std::result_of可以处理 R 是无效的
问题描述
当我使用
std::result_of<F(R)>
像这样:
template<typename R, typename... Args>
class Task
{
//...
template<typename F>
auto Then(F&& f) -> Task<typename std::result_of<F(R)>::type(Args...)>
{
//...
}
};
由于R
是另一个函数的输出类型,所以R
可能是void
,在这种情况下,会有:
error: invalid parameter type ‘void’.
所以问题是如何处理既是R
又void
不是?
解决方案
选项1
基于 SFINAE:
template <typename F>
class Task;
template <typename R, typename... Args>
class Task<R(Args...)>
{
public:
template <typename F, typename Ret = R>
auto Then(F&& f)
-> typename std::enable_if<!std::is_void<Ret>::value, Task<typename std::result_of<F(Ret)>::type(Args...)>>::type
{
return {};
}
template <typename F, typename Ret = R>
auto Then(F&& f)
-> typename std::enable_if<std::is_void<Ret>::value, Task<typename std::result_of<F()>::type(Args...)>>::type
{
return {};
}
};
选项 #2
类模板的部分特化:
template <typename F>
class Task;
template <typename R, typename... Args>
class Task<R(Args...)>
{
public:
template <typename F>
auto Then(F&& f)
-> Task<typename std::result_of<F(R)>::type(Args...)>
{
return {};
}
};
template <typename... Args>
class Task<void(Args...)>
{
public:
template <typename F>
auto Then(F&& f)
-> Task<typename std::result_of<F()>::type(Args...)>
{
return {};
}
};
选项#3
标签调度:
template <typename F>
class Task;
template <typename R, typename... Args>
class Task<R(Args...)>
{
private:
template <typename F>
auto ThenImpl(F&& f, std::true_type)
-> Task<typename std::result_of<F()>::type(Args...)>
{
return {};
}
template <typename F, typename Ret = R>
auto ThenImpl(F&& f, std::false_type)
-> Task<typename std::result_of<F(Ret)>::type(Args...)>
{
return {};
}
public:
template <typename F>
auto Then(F&& f)
-> decltype(ThenImpl(std::forward<F>(f), std::is_void<R>{}))
{
return ThenImpl(std::forward<F>(f), std::is_void<R>{});
}
};
推荐阅读
- javascript - React 15 setState 下一行不起作用
- ios - 无法检测到键盘消失?
- handlebars.js - Handlebars - 传递数据
- python - 是否可以在 python 中不使用 pop() 来查找和替换密钥?
- api - Mule ESB 3.8 Http post form-data 与文件和文本
- modal-dialog - 在模态中加载组件并将数据传回
- django - 如果将多行发送到包含多个列的模板,我如何在 django 模板中提取数据?
- flutter - Flutter 自定义多选
- sendgrid - SendGrid:是否可以使用自定义取消订阅页面而不是使用 sendgrid
- javascript - 我可以在 iframe 中使用 window.location.replace 吗?