仅使用有关类型而非对象的信息返回调用类型

问题描述 投票:3回答:3

请考虑以下代码:

template <class F, class... Args>
void function(F&& f, Args&&... args)
{
    using type1 = decltype(std::forward<F>(f)(std::forwards<Args>(args)...));
    using type2 = decltype(/*equivalent expression but only using types */);
}

在所有情况下,有没有办法使type2type1相同,但只使用decltype表达式中的类型,或者换言之,仅使用FArgs而不是fargs

c++ c++11 decltype perfect-forwarding forwarding-reference
3个回答
6
投票

你可以只使用C ++ 11而不使用std::result_of的decltype来实现这个目的:

using type2 = typename std::result_of<F&&(Args&&...)>::type;

Example in compiler explorer

一旦你开始使用C ++ 17,你应该用std::result_of替换std::invoke_result,如documentation中所述。


3
投票

也许您想要使用declval的解决方案是这样的:

template <class F, class... Args>
void function(F&& f, Args&&... args)
{
    using type1 = decltype(std::forward<F>(f)(std::forward<Args>(args)...));
    using type2 = decltype(std::forward<F>(declval<F>())(std::forward<Args>(declval<Args>())...));
}

希望这可以帮助


1
投票

从这开始:

decltype(std::forward<F>(f)(std::forwards<Args>(args)...));

改为:

decltype(std::declval<F>()(std::declval<Args>()...));

并做了。 std::declval<T>()是一个没有实现的函数,它具有与std::forward相同的返回类型。

std::result_of(和std::result_of_t),但这有一些小的怪癖,使它不完美。你可以通过使用&&修复这些怪癖:

std::result_of_t< F&&( Args&&... ) >

,他们添加了invoke_result来修复这些怪癖:

std::invoke_result_t< F, Args... >

怪癖是因为函数调用签名中允许的类型不是所有类型,并且语言以某种方式静默调整它们(删除顶级const,不允许返回某些类型等)。

© www.soinside.com 2019 - 2024. All rights reserved.