【问题标题】:array's initialization body as function parameter (C-array), is it possible?数组初始化体作为函数参数(C-array),可以吗?
【发布时间】:2011-10-05 07:17:54
【问题描述】:

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

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);

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

【问题讨论】:

    标签: c++ function parameters initialization


    【解决方案1】:

    在 C99 中有效:

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

    ..类似的事情可以用结构来完成。

    【讨论】:

    • 遗憾的是在 C++ 中不起作用。您收到错误“获取临时数组的地址”。
    • 适用于 clang 6.0 (cpp)
    • 我一直在 Xcode 中用 clang 使用这种技术,最近尝试在 Visual Studio 2017 中编译它但没有任何成功。我想知道这是否有任何名称,为什么VS不支持它?
    【解决方案2】:

    这是关于 C++11 initializer lists18.9 部分)。

    void foo (std :: initializer_list <int> inputs) {
        for (auto i : inputs) {
            // ...
        }
    }
    
    foo ({10, 20, 30});
    

    只有编译器可以创建初始值设定项列表,但您可以将其视为标准 STL 样式的容器,其中包含 begin()end()size() 和随机访问迭代器。

    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

    【讨论】:

    • 实际上,这将适用于 any 容器类,这要归功于 C++11 的统一初始化。
    【解决方案3】:

    如果initializer_list 不可用,并且数组大多很小,还有另一种选择,为 std::vector 重载&lt;&lt; 运算符,如下所示:

    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 有一个更好的解决方案。

    【讨论】:

      猜你喜欢
      • 2014-05-27
      • 1970-01-01
      • 2014-06-17
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 2012-02-11
      • 1970-01-01
      相关资源
      最近更新 更多