我正在尝试执行以下操作:
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>’
std::invoke_result的文档表明它应该可以正常工作(即没有),特别Args
是void
它说 void case 不工作是 now deprecated 的“怪癖” std::result_of
。
但不,void
不起作用。这是有道理的,因为一个也不能做std::declval<T>()
for T = void
,并且std::invoke_result
应该根据std::declval
.
问题是,修补代码以使用 void 的最优雅/直接的方法是什么?我可以做点什么,std::conditional
但我期望更好。(使用 C++17)