避免从单一元素向量转换为基元类型
Avoid Conversion from single element vector to primitive type
我在传递函数时遇到常量单个元素std::vector的问题。当std::vector变量包含单个元素时,C++编译器会自动调用错误的函数。这是C++设计的方针。然而,在这种情况下,有任何明确的方法可以指定。以下是问题的示例
assume i have two overload functions both have the same name "foo"
void foo(const std::vector<int> A)
{
// do vector operator
printf("vector thing");
}
void foo(int a)
{
// do integer operator
printf("integer thing")
}
在一般情况下,这两个函数都被正确地调用
foo({1,2,3}); // print do vector thing
foo( 3 ); // print do integer thing
然而,从c++规则来看。当调用时
foo({5}); // print do integer thing ( I want it to call as vector )
其中一种方法是创建一个可变
std::vector<int> B = { 5 };
为了解决这个问题。
我觉得这个方法有点笨拙。是否有任何方法可以使编译器无效,将{5}视为5并调用foo(int a(。
注意:这是解释问题所在的参考资料函数调用中的c++11单元素矢量初始化
您需要另一个重载,将std::initializer_list
作为参数:
void foo(std::initializer_list<int> A)
{
foo(std::vector<int>(A.begin(), A.end()));
}
如果您总是通过直接使用{...}
创建向量而不是使用std::vector
变量来调用此函数,那么您可以完全消除std::vector
过载并直接在std::initializer_list
上操作。
否,因为从C++17开始,链接答案上解释的规则仍然有效。
不过,您可以创建一个临时的,而不是一个变量。
foo(std::vector{5}); // C++17 with class type deduction
foo(std::vector<int>{5}); // older versions
消除函数调用歧义的一种方法是将整数重载作为函数模板:
template <class Int> void foo(Int a)
{
std::printf("generalized (maybe integer) thingn");
}
这样,调用
foo({3});
将认为非模板化函数是更好的匹配,而foo(3)
实例化并调用函数模板。这是因为{3}
是一个std::initializer_list<int>
,在类型推导的上下文中有一个元素。您也可以重定向到原始的foo(int a)
函数,如下所示:
void fooImpl(int a)
{
std::printf("integer thingn");
}
template <class Int> void foo(Int&& a)
{
fooImpl(std::forward<Int>(a));
}
例如,当使用不可转换为整数的参数调用foo
时,这将拒绝编译,这可能是一个理想的使用限制。此外,由于转发中间功能,您不太可能遇到性能开销。
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++中的双指针类型转换
- 逐位操作的隐式类型转换
- 模板中的类型转换
- 在 C++(和 C)中进行类型转换时明显不一致
- 字符类型转换不兼容
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- C++:用户定义的显式类型转换函数错误
- 将类指针类型转换为键时出错
- 通过引用传递参数时C++类型转换
- 在 C++ 中将一个模板类型的对象类型转换为另一个模板类型
- C++显式类型转换(C 样式强制转换)的强制表示法和static_cast的多种解释
- C++无效的函数类型转换
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何将Windows产品类型转换为名称?
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- 事件系统:使用类型转换或联合进行继承
- 如何在参数中定义隐式类型转换的构造函数?
- 类模板实例化中的类型转换