【发布时间】:2019-01-07 11:10:37
【问题描述】:
我正在尝试执行以下操作:
struct Unwrapper
{
template<typename T>
auto operator()(const T& arg, std::enable_if_t<isPrimitive<T>, void>* = nullptr) {return arg;}
template<typename T>
auto operator()(const T& arg, std::enable_if_t<!isPrimitive<T>, void>* = nullptr) {return arg.wrapped();}
void operator()(void) {}
};
template<typename T>
using UnwrappedT = std::invoke_result_t<Unwrapper, T>; // error: no type named ‘type’ in ‘struct std::invoke_result<Unwrapper, void>’
docs for std::invoke_result 建议它应该适用于 Args 是 void(即无),特别是它表示无效案例不起作用是现已弃用的 std::result_of 的“怪癖”。
但是不,void 不起作用。这是有道理的,因为T = void 也不能使用std::declval<T>(),而std::invoke_result 应该按照std::declval 来实现。
问题是,修补代码以使用 void 的最优雅/直接的方法是什么?我可以用std::conditional 做点什么,但我期望更好。
(使用 C++17)
【问题讨论】:
-
可变参数模板?
-
好叫,但不起作用。使用无参数调用
unwrap()不是问题,只是invoke_result_t不起作用 -
“与 void 一起工作”是什么意思?
Unwrapper不能用void类型的对象调用(因为没有void类型的对象),所以invoke_result可以说是在做它应该在这里做的事情。 -
@cpplearner
void是一种类型,不是完全的(如创建和传递对象 of it),但在某些程度上是的,例如你可以使用return void()语法与模板保持一致。我相信void也是一种类型,你可以问“返回 void 的方法的返回类型是什么”。答案是“它是void”。 -
好吧,如果你使用
std::invoke_result_t<Unwrapper>,你会得到void,但std::invoke_result_t<Unwrapper, void>不存在,因为void不能作为参数。
标签: c++ c++17 void result-of declval