我有一个包含vector的类:
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。
答案 0 :(得分:5)
你可以这样做:
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!
一切都一样!
但混合看起来不太好。我的偏好是第一个!
答案 1 :(得分:1)
语法不是100%,但请查看boost的list_of:http://www.boost.org/doc/libs/1_47_0/libs/assign/doc/index.html#list_of
答案 2 :(得分:0)
我不知道有任何提升功能可以做到这一点(很可能仅仅是因为我还没有看到它,“提升它”几乎是一个轴索......),但是你可以定义一个可变函数可以。它看起来像这样:
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);
}
答案 3 :(得分:0)
如果更改迭代器类型
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);
这看起来很简洁。