gpt4 book ai didi

c++ - 将 invoke_result 与 void 参数类型一起使用?

转载 作者:行者123 更新时间:2023-11-30 04:52:52 42 4
gpt4 key购买 nike

我正在尝试执行以下操作:

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 (即无),特别是它说 void 案例不起作用是现在已弃用的 std::result_of 的一个“怪癖” .

但是不,void不起作用。这是有道理的,因为一个人也做不到std::declval<T>()对于 T = void , 和 std::invoke_result应该根据 std::declval 来实现.

问题是,修补代码以使用 void 的最优雅/最直接的方法是什么?我可以用 std::conditional 做点什么但我期望更好。(使用 C++17)

相关问题:this , this .

最佳答案

你可以这样做:

template<typename... T>
using UnwrappedT = std::invoke_result_t<Unwrapper, T...>;

UnwrappedT<>会处理 void案例。

如果你想要UnwrappedT<void>意思是UnwrappedT<> , 你需要一些方法来删除 void . conditional是最熟悉的做事方式:

template<typename T>
using UnwrappedT = typename std::conditional_t<
std::is_void_v<T>,
std::invoke_result<Unwrapper>,
std::invoke_result<Unwrapper, T>>::type;

或者您可以使用 Boost.Mp11 获得一些乐趣:

template<typename T>
using UnwrappedT = mp_apply<std::invoke_result_t,
mp_remove_if<mp_list<Unwrapper, T>, std::is_void>>;

关于c++ - 将 invoke_result 与 void 参数类型一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54073245/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com