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 */);
}

有没有办法在所有情况下都type2一样,但只使用表达式中的类型,或者换句话说,只使用and而不是and ?type1decltypeFArgsfargs

4

3 回答 3

7

您可以仅使用 C++11 而无需使用 decltype 来完成此操作std::result_of

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

编译器资源管理器中的示例

一旦你开始使用 C++17,你应该按照文档中的描述替换std::result_of为。std::invoke_result

于 2017-12-18T18:00:29.323 回答
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>())...));
}

希望这可以帮助

于 2017-12-18T17:52:01.323 回答
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,不允许返回某些类型等)。

于 2017-12-18T19:08:59.293 回答