数组的初始化体作为函数参数(C-array),是否可能?

art*_*vin 20 c++ parameters initialization function

我在下一个情况下寻找一些帮助:
我有一些类和一些方法,语法是这样的:

class SomeClass {  
    public:  
            void doSomething(int *a);  
};
Run Code Online (Sandbox Code Playgroud)

所以我想把这个方法称为

SomeClass::doSomething({ 0, 1, 2, 3, 4 });
Run Code Online (Sandbox Code Playgroud)

有可能用任何语言吗?任何(C++,C,obj-c,obj-c ++)实现都是受欢迎的!我知道这个初始化块是一个数组体,就像

int *a = { 0, 1, 2, 3, 4 };
SomeClass::doSomething(a);
Run Code Online (Sandbox Code Playgroud)

但是,我认为,如果在函数调用之前没有临时变量,接口看起来会很棒(因为我们不需要知道class-client中的参数类型).那么,有没有机会做到这一点?

Dmi*_*tri 23

在C99中,这适用于:

functionThatTakesIntPtrOrArray( (int []){ 1, 2, 3, 4 } );
Run Code Online (Sandbox Code Playgroud)

..结构可以做类似的事情.

  • 可悲的是在C++中不起作用.您收到错误"获取临时数组的地址". (3认同)
  • 我一直在 Xcode 中使用此技术与 clang,最近尝试在 Visual Studio 2017 中编译它,但没有成功。我想知道这是否有任何名称,为什么 VS 不支持它? (2认同)

spr*_*aff 8

这是关于C++ 11 初始化列表(第18.9节).

void foo (std :: initializer_list <int> inputs) {
    for (auto i : inputs) {
        // ...
    }
}

foo ({10, 20, 30});
Run Code Online (Sandbox Code Playgroud)

只有编译器可以创建一个初始化列表,但你可以把它像一个标准的STL风格的容器begin(),end(),size(),和随机访问迭代器.

std::vector (我希望其他一些容器)现在可以用初始化列表构建,所以

std :: vector <std :: string> foo {"a", "b"};
Run Code Online (Sandbox Code Playgroud)

相当于

std :: vector <std :: string> foo;
foo .push_back ("a");
foo .push_back ("b");
Run Code Online (Sandbox Code Playgroud)

除了它可以执行更少的分配.请注意,const char*已经std::string自动转换为.