Учитывая количество перегруженных функций, принимающих параметры разного типа, есть ли способ получить возвращаемый тип или один из типов параметров для конкретной перегрузки в заданном контексте во время компиляции? Рассмотрим, например, такую ситуацию, когда перегруженная функция принимает ссылку на параметр как выходное значение:
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());
}
Откуда мне знать, какой тип должен быть out-param до вызова какой-либо версии process_in_place
, в конечном итоге выбранной?