gpt4 book ai didi

c++ - 为什么 decltype 不能与重载函数一起使用?

转载 作者:IT老高 更新时间:2023-10-28 21:44:33 25 4
gpt4 key购买 nike

如果您调用它的函数重载,

decltype 将失败,如下代码所示:

#include <iostream>

int test(double x, double y);
double test(int x, int y);
char test(char x, int y);

int main()
{
std::cout << decltype(test) << std::endl;

return 0;
}

结果:

error: decltype cannot resolve address of overloaded function

我知道这是因为 decltype 无法确定您要获取的函数类型。但是为什么没有其他方法可以使这项工作,像这样:

std::cout << decltype(test(double, double)) << std::endl;

或者这个:

double x = 5, y = 2;
std::cout << decltype(test(x, y)) << std::endl;

由于一个函数不能简单地基于返回类型进行重载,将数据类型或实际变量传递给 decltype 调用是否足以告诉它应该检查哪些重载?我在这里错过了什么?

最佳答案

要从您传递的参数类型中找出函数的类型,您可以使用 decltype “构建”返回类型并用这些类型“调用”它,然后添加到参数列表中以将整个类型拼凑在一起。

template<typename... Ts>
using TestType = decltype(test(std::declval<Ts>()...))(Ts...);

正在做TestType<double, double>将导致类型 int(double, double) .你可以找到一个完整的例子here .

或者,您可能会发现尾随返回类型语法更具可读性:

template<typename... Ts>
using TestType = auto(Ts...) -> decltype(test(std::declval<Ts>()...));

关于c++ - 为什么 decltype 不能与重载函数一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22291737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com