有时,在您不想显式指定类型的情况下创建正确类型的变量非常有用,特别是当类型是复杂类型(例如std::map<std::string, std::tuple<int, SomeStructure>>(1)时) 。这是几乎总是自动指南的核心。
对于初始化变量的情况,可以使用:
\nauto a = 3.14159f; // float.\nauto a = function_returning_type(1, 2, 3); // whatever that function returns.\nRun Code Online (Sandbox Code Playgroud)\n如果你不想初始化它,你可以使用decltype它来定义它:
int a;\ndecltype(a) b; // integer\n\n\nfloat c();\ndecltype(c()) d; // float\nRun Code Online (Sandbox Code Playgroud)\n如果您想将类型基于某个函数返回的内容而不是现有的变量,那么最后一个特别方便。但是,如果该函数的唯一重载需要很多参数,则似乎需要您提供它们:
\nint a(const char *, int, float);\ndecltype(a("", 7, 4.2)) b; // okay\ndecltype(a()) c; // not okay\nRun Code Online (Sandbox Code Playgroud)\n第二个样本给出了类似的内容:
\nerror: too few arguments to function \xe2\x80\x98int a(const char *, int, float)\xe2\x80\x99\n decltype(a()) c;\n ^\nRun Code Online (Sandbox Code Playgroud)\n尽管事实上在这种情况下不需要参数,因为编译器可以在没有参数的情况下确定这一点。无论为函数提供多少个重载,其返回类型都是相同的。
\n所以我的第一个问题是:我是否误解了这样做的必要性?换句话说,我需要提供参数是否有实际原因?
\n其次(这是真正的问题),有没有一种方法可以做到这一点,而不需要我提供这些人工参数?
\n(1)是的,我知道我可以做类似的事情using ShortType = std::map<std::string, std::tuple<int, SomeStructure>>;,但这并不总是我的代码。
无论为函数提供多少个重载,其返回类型都是相同的。
不,无论如何都不是。以下是完全有效的重载。
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)