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