如何在 c++17 或 20 中使用 std::invoke_result_t 而不是在 c++14 中使用 std::result_of_t?
How to use std::invoke_result_t in c++17 or 20 instead of std::result_of_t in c++14?
当我在 C++14 中使用 std::result_of_t 时,它如我所愿:
void just_simple()
{
std::cout << "【4】: in func return nothing. " << std::endl;
}
template<typename Callback, typename... Args>
auto InTemplate_Call(Callback&& bc, Args&&... args)
{
typedef typename std::result_of_t<std::decay_t<Callback>(std::decay_t<Args>...)> ReturnType;
//typedef typename std::invoke_result_t<std::decay_t<Callback>(std::decay_t<Args>...)> ReturnType;
if (typeid(ReturnType) == typeid(void))
{
std::cout << "get a void type" << std::endl;
}
return rtDeduction<ReturnType>::type();
}
int main(){
InTemplate_Call(just_simple);
return 0;
}
ReturnType
就是 void
。
但它在 c++17 或 20 中不起作用:
template<typename Callback, typename... Args>
auto InTemplate_Call(Callback&& bc, Args&&... args)
{
//typedef typename std::result_of_t<std::decay_t<Callback>(std::decay_t<Args>...)> ReturnType;
typedef typename std::invoke_result_t<std::decay_t<Callback>(std::decay_t<Args>...)> ReturnType;
if (typeid(ReturnType) == typeid(void))
{
std::cout << "get a void type" << std::endl;
}
return rtDeduction<ReturnType>::type();
}
ReturnType
不再是 void
!
有没有我弄错的地方?
invoke_result
和result_of
的区别在于前者接受可调用类型和参数类型,而你的std::decay_t<Callback>(std::decay_t<Args>...)
只是一个函数类型 那 returns 个 std::decay_t<Callback>
.
区别如下:
#include <functional>
void just_simple() {}
template<typename Callback>
void foo(Callback&&)
{
static_assert(std::is_same_v<std::invoke_result_t<Callback()>, Callback>);
static_assert(std::is_same_v<std::invoke_result_t<Callback >, void>);
}
int main() {
foo(just_simple);
}
你应该这样做:
typedef typename std::invoke_result_t<
std::decay_t<Callback>,
std::decay_t<Args>...> ReturnType;
当我在 C++14 中使用 std::result_of_t 时,它如我所愿:
void just_simple()
{
std::cout << "【4】: in func return nothing. " << std::endl;
}
template<typename Callback, typename... Args>
auto InTemplate_Call(Callback&& bc, Args&&... args)
{
typedef typename std::result_of_t<std::decay_t<Callback>(std::decay_t<Args>...)> ReturnType;
//typedef typename std::invoke_result_t<std::decay_t<Callback>(std::decay_t<Args>...)> ReturnType;
if (typeid(ReturnType) == typeid(void))
{
std::cout << "get a void type" << std::endl;
}
return rtDeduction<ReturnType>::type();
}
int main(){
InTemplate_Call(just_simple);
return 0;
}
ReturnType
就是 void
。
但它在 c++17 或 20 中不起作用:
template<typename Callback, typename... Args>
auto InTemplate_Call(Callback&& bc, Args&&... args)
{
//typedef typename std::result_of_t<std::decay_t<Callback>(std::decay_t<Args>...)> ReturnType;
typedef typename std::invoke_result_t<std::decay_t<Callback>(std::decay_t<Args>...)> ReturnType;
if (typeid(ReturnType) == typeid(void))
{
std::cout << "get a void type" << std::endl;
}
return rtDeduction<ReturnType>::type();
}
ReturnType
不再是 void
!
有没有我弄错的地方?
invoke_result
和result_of
的区别在于前者接受可调用类型和参数类型,而你的std::decay_t<Callback>(std::decay_t<Args>...)
只是一个函数类型 那 returns 个 std::decay_t<Callback>
.
区别如下:
#include <functional>
void just_simple() {}
template<typename Callback>
void foo(Callback&&)
{
static_assert(std::is_same_v<std::invoke_result_t<Callback()>, Callback>);
static_assert(std::is_same_v<std::invoke_result_t<Callback >, void>);
}
int main() {
foo(just_simple);
}
你应该这样做:
typedef typename std::invoke_result_t<
std::decay_t<Callback>,
std::decay_t<Args>...> ReturnType;