1

我有一个包含向量的类:

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。

4

4 回答 4

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!

都是一样的!

但是混合看起来并不好。我的偏好是第一个!

于 2011-08-26T06:50:33.517 回答
1

不是 100% 相同的语法,但请查看 boost 的 list_of: http: //www.boost.org/doc/libs/1_47_0/libs/assign/doc/index.html#list_of

于 2011-08-26T06:41:23.970 回答
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);
}
于 2011-08-26T06:42:17.217 回答
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);

这看起来很简洁。

于 2011-08-26T06:56:59.083 回答