将可变大小元素列表添加到向量的语法糖?

发布于 2024-12-01 15:41:13 字数 553 浏览 1 评论 0原文

我有一个包含向量的类:

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。

I have a class that contains a 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);
  }
};

Is there any way to allow the following concise function calls? (Maybe by changing the addKids function above?)

int main() {
  Foo foo;
  foo.addKids(23,51,681);             // these...
  foo.addKids(3,6,1,4,88,2,4,-2,101); // ...would be nice?!
}

I suspect you can do it with C++0x vector initializer lists? But unfortunately, I cannot use C++0x. I can use Boost, though, if that helps.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

深居我梦 2024-12-08 15:41:13

您可以这样做:

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!

全部相同!

但混合起来效果不太好。我的偏好是第一个!

You can do this:

Foo foo;
foo << 3, 6, 1, 4, 88, 2, 4, -2, 101; //inserts all!

For that you've to overloaded << and , operators, as:

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

Once you implement this, then you can also write:

foo << 3 << 6 << 1 << 4 << 88 << 2 << 4 << -2 << 101; //inserts all!

Even this,

foo, 3, 6, 1, 4, 88, 2, 4, -2, 101; //inserts all!

Or mix both as:

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!

All are same!

But mixing doesn't look good. My preference is the very first one!

梨涡 2024-12-08 15:41:13

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

Not 100% the same syntax, but check out boost's list_of: http://www.boost.org/doc/libs/1_47_0/libs/assign/doc/index.html#list_of

一个人的旅程 2024-12-08 15:41:13

我不知道有任何 boost 功能可以做到这一点(很可能只是因为我还没有看到它,“boost has it”几乎是一个公理......),但是您可以定义一个可变参数函数来执行此操作。它看起来像这样:

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

I'm not aware of any boost functionality that does this (most likely just because I haven't seen it yet, "boost has it" is almost an axoim...), but you could define a variadic function that does it. It'd look something like this:

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);
}
日暮斜阳 2024-12-08 15:41:13

如果您更改迭代器类型

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

这看起来非常简洁。

If you change your iterator types

template<typename T>
void addKids(T begin, T end)
{
  m_kids.insert(m_kids.end(), begin, end);
}

then you can at least do this:

int kids={1,2,3,4};
foo.addKids(kids,kids+4);

Which seems pretty concise.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文