您可以在不提供参数的情况下基于函数进行类型推断吗?

pax*_*blo 1 c++ decltype auto

有时,在您不想显式指定类型的情况下创建正确类型的变量非常有用,特别是当类型是复杂类型(例如std::map<std::string, std::tuple<int, SomeStructure>>(1)时) 。这是几乎总是自动指南的核心。

\n

对于初始化变量的情况,可以使用:

\n
auto a = 3.14159f;                          // float.\nauto a = function_returning_type(1, 2, 3);  // whatever that function returns.\n
Run Code Online (Sandbox Code Playgroud)\n

如果你不想初始化它,你可以使用decltype它来定义它:

\n
int a;\ndecltype(a) b;  // integer\n\n\nfloat c();\ndecltype(c()) d;  // float\n
Run Code Online (Sandbox Code Playgroud)\n

如果您想将类型基于某个函数返回的内容而不是现有的变量,那么最后一个特别方便。但是,如果该函数的唯一重载需要很多参数,则似乎需要您提供它们:

\n
int a(const char *, int, float);\ndecltype(a("", 7, 4.2)) b;        // okay\ndecltype(a()) c;                  // not okay\n
Run Code Online (Sandbox Code Playgroud)\n

第二个样本给出了类似的内容:

\n
error: too few arguments to function \xe2\x80\x98int a(const char *, int, float)\xe2\x80\x99\n    decltype(a()) c;\n               ^\n
Run Code Online (Sandbox Code Playgroud)\n

尽管事实上在这种情况下不需要参数,因为编译器可以在没有参数的情况下确定这一点。无论为函数提供多少个重载,其返回类型都是相同的。

\n

所以我的第一个问题是:我是否误解了这样做的必要性?换句话说,我需要提供参数是否有实际原因?

\n

其次(这是真正的问题),有没有一种方法可以做到这一点,而不需要我提供这些人工参数?

\n
\n

(1)是的,我知道我可以做类似的事情using ShortType = std::map<std::string, std::tuple<int, SomeStructure>>;,但这并不总是我的代码。

\n

Cal*_*eth 5

无论为函数提供多少个重载,其返回类型都是相同的。

不,无论如何都不是。以下是完全有效的重载。

int getValue(float);
float getValue(int);
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以做到这一点,不需要我提供这些人为参数?

仅当没有过载时。

std::invoke_result_t<decltype(a)> c;
Run Code Online (Sandbox Code Playgroud)