避免从单个元素向量转换为基本类型

Moo*_*Moo 3 c++ stl stdvector c++11

通过函数时,我遇到了常量单元素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")
}
Run Code Online (Sandbox Code Playgroud)

通常情况下,这两个函数都被正确调用

foo({1,2,3});    // print do vector thing
foo( 3 );        // print do integer thing
Run Code Online (Sandbox Code Playgroud)

但是来自c ++规则.打电话的时候

foo({5});        // print do integer thing ( I want it to call as vector )
Run Code Online (Sandbox Code Playgroud)

其中一种方法是创建一个变量

std::vector<int> B = { 5 };
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题.

我觉得这种方法有点笨拙.有没有任何方法可以使编译器无效,将{5}视为5并调用foo(int a).

注意:这里的参考解释了函数调用中c ++ 11单元素向量初始化的问题

Hol*_*Cat 6

你需要另一个重载,std::initializer_list作为参数:

void foo(std::initializer_list<int> A)
{
    foo(std::vector<int>(A.begin(), A.end()));
}
Run Code Online (Sandbox Code Playgroud)

如果你总是通过直接创建向量{...}而不是使用std::vector变量来调用此函数,那么你可以std::vector完全删除过载并直接操作std::initializer_list.


Pau*_*nto 5

不,因为从C++ 17开始,链接答案中解释的规则仍然有效.

但是,您可以创建临时变量而不是变量.

foo(std::vector{5});      // C++17 with class type deduction
foo(std::vector<int>{5}); // older versions
Run Code Online (Sandbox Code Playgroud)