/ c ++ 11/14是否支持像vector <auto>这样的东西

da *_*man 5 c++11 c++14

我想知道c ++ 11/c ++ 14是否/已经支持过类似的东西vector<auto>?如果没有,有什么理由吗?

Jer*_*fin 8

它不是直接支持,也不是立即清楚你想要它做什么.

评论已经提到了一些用于创建异构集合的可能性(例如Boost anyvariant类).我希望这不是你所追求的,因为异构集合与C++的搭配很差,所以使用它们是丑陋和笨拙的.我认为有些情况/情况确实是最好的选择,但至少根据我的经验,这些情况相当罕见.

你可能想要的另一个可能的解释是一个矢量(auto一般来说)只包含一个类型,但是这个类型是从初始化器中推导出来的,所以如果你从某个ints 初始化了这个矢量,你就会得到一个vector<int>,如果你从一些字符串初始化它,你得到一个vector<string>,等等.虽然该语言不直接支持,但至少在某种程度上很容易模拟它.模板不能/不能推断模板参数,但模板函数可以/可以.因此,我们可以创建一个微小的函数模板来获取一些初始值,推导出它们的类型,并返回该类型的向量.例如:

template <class T>
std::vector<T> make_vector(std::initializer_list<T> init) {
    return std::vector<T>(init);
}
Run Code Online (Sandbox Code Playgroud)

这将返回一个vector<T>(T从初始化列表中的数据类型推导出来),因此您可以执行以下操作:

auto a = make_vector({ 1, 2, 3, 4 });       // a -> vector<int>
auto b = make_vector({ 1.0, 2.0, 3.0 });    // b -> vector<double>
auto c = make_vector({ "1"s, "2"s, "3"s }); // c -> vector<std::string>
Run Code Online (Sandbox Code Playgroud)

最后一个需要用户定义的文字运算符,它是C++ 14中的新功能(许多编译器尚不支持).其余的应该适用于C++ 11.

还有一些讨论(以及N3602中的一个提议)添加一个功能(可能是C++ 17),你可以在其中定义类似make_vector上面的内容,但是类似于类的模板化构造函数.这将允许您在构造函数上使用参数推导来推断整个类的模板参数,因此您可以执行以下操作:

X x(1);     // deduces as X<int>
X x(2.0)    // deduces as X<double>
Run Code Online (Sandbox Code Playgroud)

但警告:这已被提出但未被接受.它可能(很容易)永远不会被接受 - 即使它是,它可能会在发生之前发生重大变化.