有没有办法避免重复并提高模板函数返回类型的可读性?

这是一个例子

template <typename FunctionType>
std::enable_if_t<
    !std::is_void_v<std::invoke_result_t<FunctionType, MyClass*>>,
    std::optional<std::invoke_result_t<FunctionType, MyClass*>>
> CallIfValid(MyClass* instance, FunctionType func)
{
    using InvocationType = std::invoke_result_t<FunctionType, MyClass*>;
    if (instance != nullptr)
    {
        return func(instance);
    }
    else
    {
        return std::optional<InvocationType>();
    }
}

请注意,std::invoke_result_t<FunctionType, MyClass*>如何最终在返回类型中重复两次,并在方法主体中第三次重复。

我在这里没有看到任何建议或技巧吗?

谢谢

最佳答案

我也有同样的问题。我个人认为,没有一个好的实际解决方案,而不是一般情况。但是您可以采用一些缓解措施/解决方法。在您的示例中,您可以添加默认模板参数。同样,由于您指定了返回类型,因此无需在返回表达式中重复该类型:

template <typename FunctionType, class InvocationType  = std::invoke_result_t<FunctionType, MyClass*>>
std::enable_if_t<
    !std::is_void_v<InvocationType >,
    std::optional<InvocationType >
> CallIfValid(MyClass* instance, FunctionType func)
{
    if (instance != nullptr)
    {
        return func(instance);
    }
    else
    {
        return std::nullopt; // if you want to be explicit (I personally prefer this)
        // return {}; // if you want to be terse
    }
}

10-05 22:43
查看更多