c++ - 使用初始化列表创建单项向量
问题描述
我有一个函数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
重载)?我可以显式地创建一个向量,但{}
看起来更好。
解决方案
正如链接的问题重复(原始)中提到的,没有办法强制解决有利于过载的解决方案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}
如果不伴随类型的话,它真的很模棱两可。
推荐阅读
- swift - 如何在 SubView SwiftUI 中使用 BaseView @State 属性
- firebase - 在本机反应中找不到 Firebase crashlytics 崩溃日志?
- asp.net - 是否有跨平台的替代代码
- c# - 在 EF 中获取最后一个可能的 Id 是更快/更好的选择:MaxAsync 与 LastAsync?
- php - 警告:number_format() 期望参数 1 为浮点数,字符串在 D:\xampp\htdocs\website\foodpoint\welcome.php 第 205 行给出
- android - 在没有服务的情况下继续在后台运行 CountdownTimer
- python - 熊猫计算给出不正确的小数点
- javascript - 在 Materializecss Carousel 中更改子项目的 translatex 和 translatey
- java - PersistenceUnit 的预部署失败,因为在将 Maven 添加到项目后“使用非实体”
- sharepoint - 从搜索中排除文档库项目