首页 > 解决方案 > 使用初始化列表创建单项向量

问题描述

我有一个函数func被重载以获取std::vector<Obj>参数或Obj参数。

#include <vector>
#include <iostream>

class Obj {
    int a = 6;
};

void func(const std::vector<Obj>& a) {
    std::cout << "here" << std::endl;
}

void func(const Obj& a) {
    std::cout << "there" << std::endl;
}

int main() {
    Obj obj, obj2;
    func({obj});
    func({obj, obj2});
}

实际输出:

there
here

预期输出:

here
here

它似乎{obj}没有初始化一个向量,而是一个对象。我想在初始化哪种类型时有一些优先顺序。如何精确控制?

(使用 g++ (Ubuntu 8.3.0-6ubuntu1) 8.3.0 编译的示例。)

我发现了一个可能的重复项(函数调用中的 c++11 单元素向量初始化),尽管我的问题仍未得到解答:

我知道{obj}可以解析为对象而不是单个元素的向量,而前者优先。但是有没有办法用来{}创建单个项目向量(以便foo解决std::vector重载)?我可以显式地创建一个向量,但{}看起来更好。

标签: c++initializer-list

解决方案


正如链接的问题重复(原始)中提到的,没有办法强制解决有利于过载的解决方案std::initializer_list

原始签名(int用于简化):

void func(const std::vector<int> &a); 
void func(const int &a);

由于我多次遇到这种情况,我通常会这样做:

func(std::vector<int>{10});

我不知道这样做的任何更短的方法,因为使用std::initializer_list会做同样事情的实际类型更加冗长。但从好的方面来说,它至少让你所做的事情变得非常清楚,因为{10}如果不伴随类型的话,它真的很模棱两可。


推荐阅读