在cppreference上,写着使用std::result_of
的正确方法是:
template<class F, class... Args>
std::result_of_t<F&&(Args&&...)>
// instead of std::result_of_t<F(Args...)>, which is wrong
my_invoke(F&& f, Args&&... args) {
/* implementation */
}
我想知道应该如何使用std::invoke_result_t
:
invoke_result_t
:
template<class F, class... Args>
std::invoke_result_t<F&&, Args&&...> my_invoke(F&& f, Args&&... args);
或者:
template<class F, class... Args>
std::invoke_result_t<F, Args...> my_invoke(F&& f, Args&&... args);
答案 0 :(得分:4)
invoke_result
是根据declval
:
如果表达式
INVOKE(declval<Fn>(), declval<ArgTypes>()...)
在被视为未评估的操作数时格式正确,则成员typedeftype
将类型命名为decltype(INVOKE(declval<Fn>(), declval<ArgTypes>()...));
,否则将不存在成员type
。
和declval
指定为:
template<class T> add_rvalue_reference_t<T> declval() noexcept;
因此std::invoke_result_t<F&&, Args&&...>
和std::invoke_result_t<F, Args...>
之间没有区别。好吧,后者短4个字符,但它们的意思完全相同(因为F
和Args...
都不是void
)。