将可变大小元素列表添加到向量的语法糖?
问题描述:
我有一个包含一个向量类:将可变大小元素列表添加到向量的语法糖?
class Foo {
typdef std::vector<int> Vec;
Vec m_kids;
void addKids(Vec::const_iterator begin,
Vec::const_iterator end) {
m_kids.insert(m_kids.end(), begin, end);
}
};
有没有什么办法可以让下面简洁的函数调用? (也许通过改变上述addKids
功能?)
int main() {
Foo foo;
foo.addKids(23,51,681); // these...
foo.addKids(3,6,1,4,88,2,4,-2,101); // ...would be nice?!
}
我怀疑你可以用的C++ 0x矢量初始化列表办呢?但不幸的是,我不能使用C++ 0x。如果有帮助,我可以使用Boost。
答
你可以这样做:
Foo foo;
foo << 3, 6, 1, 4, 88, 2, 4, -2, 101; //inserts all!
,为您所超载<<
和,
运营商,如:
class Foo {
typdef std::vector<int> Vec;
Vec m_kids;
public:
Foo& operator<<(int item) {
m_kids.push_back(item); return *this;
}
Foo& operator,(int item) {
m_kids.push_back(item); return *this;
}
};
一旦你实施这个,那么你也可以写:
foo << 3 << 6 << 1 << 4 << 88 << 2 << 4 << -2 << 101; //inserts all!
即使这样,
foo, 3, 6, 1, 4, 88, 2, 4, -2, 101; //inserts all!
或者混合使用这两个为:
foo << 3, 6, 1 << 4, 88, 2 << 4 << -2, 101; //inserts all!
//and this too!
foo,3 << 6, 1 << 4, 88, 2 << 4 << -2, 101; //inserts all!
全部都是一样的!
但混合看起来不太好。我的首选是第一个!
答
不是100%相同的语法,但检查出升压转换器的LIST_OF:http://www.boost.org/doc/libs/1_47_0/libs/assign/doc/index.html#list_of
答
,我不知道有任何升压功能,做到这一点(最有可能的,只是因为我还没有看到它,“助推了它“几乎是一个axoim ...),但是你可以定义一个可变参数来实现它。它会是这个样子:
void addKids(int N, ...) {
va_list args;
va_start(args, N);
for(int i = 0; i < N; ++i) {
int val = va_arg(args, int);
m_kids.push_back(val);
}
va_end(args);
}
答
如果你改变你的迭代器类型
template<typename T>
void addKids(T begin, T end)
{
m_kids.insert(m_kids.end(), begin, end);
}
,那么你至少可以做到这一点:
int kids={1,2,3,4};
foo.addKids(kids,kids+4);
这似乎很简洁。
这很聪明!重载'operator,'只是为了与我想要的语法兼容?正如你写的那样,'foo carlpett
@carlpett:是的。 – Nawaz
+1这是'boost :: assign'库中的一种方法,我不喜欢它,但仅仅是品味问题(它是我不喜欢的'operator'的重载)。或者,C++的CORBA映射为'类似的目的使用'operator =