使用 invoke_result 的正确方法?
Correct way of using invoke_result?
在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);
invoke_result
根据 declval
:
定义
If the expression INVOKE(declval<Fn>(), declval<ArgTypes>()...)
is well-formed when treated as an unevaluated operand, the member typedef type
names the type decltype(INVOKE(declval<Fn>(), declval<ArgTypes>()...));
otherwise, there shall be no member 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
)。
在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);
invoke_result
根据 declval
:
If the expression
INVOKE(declval<Fn>(), declval<ArgTypes>()...)
is well-formed when treated as an unevaluated operand, the member typedeftype
names the typedecltype(INVOKE(declval<Fn>(), declval<ArgTypes>()...));
otherwise, there shall be no membertype
.
和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
)。