[英]c++ how to define a std::result_of<F(R)> that can handle R is void
When i am using当我使用
std::result_of<F(R)>
like this:像这样:
template<typename R, typename... Args>
class Task
{
//...
template<typename F>
auto Then(F&& f) -> Task<typename std::result_of<F(R)>::type(Args...)>
{
//...
}
};
Since R
is another function's output type, so R
may be void
, in this situation, there will be:由于
R
是另一个函数的输出类型,所以R
可能是void
,在这种情况下,会有:
error: invalid parameter type ‘void’.
So the question is how to handle both R
is void
and is not?所以问题是如何处理
R
是void
和不是?
SFINAE-based:基于 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 {};
}
};
Partial-specialization of the class template:类模板的部分特化:
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 {};
}
};
Tag-dispatching:标签分发:
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>{});
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.