我正在寻找下一种情况下的帮助:
我有一些类和一些方法,语法是这样的:
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);
但我认为,如果在函数调用之前没有临时变量(因为我们不需要知道class-client中的参数类型),那么接口看起来会很棒。那么,有没有可能做到这一点呢?
发布于 2011-10-05 15:19:51
这是关于C++11 initializer lists (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
。
发布于 2011-10-05 15:33:04
在C99中,这是可行的:
functionThatTakesIntPtrOrArray( (int []){ 1, 2, 3, 4 } );
..and类似的事情也可以用结构来完成。
发布于 2015-09-25 07:12:54
如果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有一个更好的解决方案。
https://stackoverflow.com/questions/7657910
复制相似问题