当包装在 method 中时,类型会成功扣除,但在直接别名中使用时则不会

Type is deducted successfully when is wrapped in method, but not when used in direct alias

提问人:Nufun 提问时间:3/21/2022 最后编辑:Nufun 更新时间:3/21/2022 访问量:36

问:

类型演绎被包装方法的代码

struct InterfaceOverriderFactory
{
    template <typename Interface>
    decltype(auto) operator()(Type<Interface>) const noexcept
    {
         return typename FunctionArguments::InvokeOperatorArguments<Interface>{};
    }
};

别名(用作扣除指南)

template <typename Interface, typename Code>
using IO = typename std::invoke_result_t<InterfaceOverriderFactory, Type<Interface>>::PushFront<Code>::PushFront<Interface>::WithT<InterfaceOverrider>;

相同的代码,但没有将其包装在方法中

template <typename Interface, typename Code>
using IO = typename FunctionArguments::InvokeOperatorArguments<Interface>::PushFront<Code>::PushFront<Interface>::WithT<InterfaceOverrider>;

这两个代码片段都用于

template <typename ...Interfaces, typename ...Codes>
Strategy(std::pair<type::Type<Interfaces>, Codes>...) -> Strategy<type::IO<Interfaces, Codes>...>;

对于通过方法推断类型的代码,我有Strategy<SomeTypes...>

对于直接别名 -Strategy<>

此代码通过模板 <typename... 返回保存类型的结构参数>

FunctionArguments::InvokeOperatorArguments<Interface>

因此,我想使“相同的代码,但不将其包装在方法中”段落中的代码工作,或者如果无法知道原因

C++ 别名 模板-元编程 演绎指南

评论

0赞 Eljay 3/21/2022
std::invoke 能帮上忙吗?
0赞 Nufun 3/21/2022
@Eljay 如果你的意思是用 std::invoke 替换 std::invoke_result_t - 它不会解决问题。我想摆脱InterfaceOverriderFactory。出于某种原因,代码在方法和别名中使用时工作方式不同FunctionArguments::InvokeOperatorArguments<Interface>

答: 暂无答案