首页 > 解决方案 > 带有invoke_result的重载命名非成员函数的返回类型

问题描述

给定许多采用不同类型参数的重载函数,有没有办法在编译时在模板化上下文中获取特定重载的返回类型或参数类型之一?例如,考虑这种情况,重载函数将参数引用作为输出值:

struct struct_a { };
struct struct_b { };
struct struct_c { };

float process(struct_a) { return 5.0f;  }
bool  process(struct_b) { return true; }
int   process(struct_c) { return -1; }

void process_in_place(struct_a, float& out) { out = 5.0f;  }
void process_in_place(struct_b, bool& out) { out = true;  }
void process_in_place(struct_c, int& out) { out = -1;  }

template<typename T>
void do_process(T val)
{
    auto result1 = process(val);
    std::cout << result1 << std::endl;

    // ???
    //using post_process_type = std::invoke_result_t<decltype(process)&(std::declval<T>)>;
    // ???
    post_process_type result2;
    process_in_place(val, result2);
}

int main()
{
    do_process(struct_a());
    do_process(struct_b());
    do_process(struct_c());
}

process_in_place在调用最终选择的任何版本之前,我怎么知道 out-param 应该是什么类型?

标签: c++templatespolymorphismc++17decltype

解决方案


using post_process_type = decltype(process(std::declval<T>()));

这会做。decltype只会在重载决议选择正确后查看返回类型process


推荐阅读