c++ 数组的初始化体作为函数参数(C数组),可以吗?

72qzrwbm  于 2023-01-03  发布在  其他
关注(0)|答案(4)|浏览(149)

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

class SomeClass {  
    public:  
            void doSomething(int *a);  
};

我想这样调用这个方法

SomeClass::doSomething({ 0, 1, 2, 3, 4 });

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

int *a = { 0, 1, 2, 3, 4 };
SomeClass::doSomething(a);

但是我认为,如果在函数调用之前没有临时变量(因为我们不需要知道类客户端中的参数类型),那么接口看起来会很棒。

tv6aics1

tv6aics11#

在C99中,这是可行的:

functionThatTakesIntPtrOrArray( (int []){ 1, 2, 3, 4 } );

..类似的事情可以用结构体来做。

kknvjkwl

kknvjkwl2#

这是关于C++11初始化器列表的(章节18.9)。

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

foo ({10, 20, 30});

只有编译器可以创建初始化器列表,但您可以将其视为具有begin()end()size()和随机访问迭代器的标准STL样式容器。
std::vector(我希望还有其他一些容器)现在可以用初始化器列表构造,所以

std :: vector <std :: string> foo {"a", "b"};

相当于

std :: vector <std :: string> foo;
foo .push_back ("a");
foo .push_back ("b");

除了它可能执行更少的分配。注意const char*已经自动变成std::string

kxe2p93d

kxe2p93d3#

如果initializer_list不可用,并且数组大部分都很小,则还有另一个选择,即为std::vector重载<<运算符,如下所示:

template <typename T>
inline std::vector<T> operator <<( const std::vector<T>& vec, const T& val ) {
    std::vector<T> result(vec);
    result.push_back(val);
    return result;
}

有了它,你可以这样做:

void foo (const std::vector<int>& inputs) {
    // ...
}

foo ( std::vector<int>() << 10 << 20 << 30 );

单行初始化和不必指定向量大小的便利性是要付出代价的。为添加的每个元素创建先前向量的副本,使运行时间至少是向量大小的二次方--这就是为什么这最适合于短向量和性能无关紧要的情况。正如spraff的回答中所指出的,对于C++11有一个更好的解决方案。

628mspwn

628mspwn4#

可以将临时数组初始化为函数参数,如下所示

// onboard LED
const byte LED_RED = 36;
const byte LED_BLUE = 34;
const byte LED_GREEN = 35;
    
void turnOffLedAll(){
        // TURN OFF ALL LED
      digitalWrite(LED_RED, LOW);
      digitalWrite(LED_BLUE, LOW);
      digitalWrite(LED_GREEN, LOW);
    }
    
void statusLED(byte led[], byte stat, byte time=0) {
      turnOffLedAll();
      // turn ON LED
      for(int i=0; i<(sizeof(led)/sizeof(led[0])); i++){
        digitalWrite(led[i], stat);
      }
      if (time>0){
        delay(time*1000);
        turnOffLedAll();
      }
    }

考虑上述函数,可以像这样将内联数组初始化作为函数参数:

statusLED((byte*)(const byte[]){LED_RED}, LOW, 0);

相关问题