Синтаксический сахар для добавления списков элементов переменного размера в вектор? - PullRequest
1 голос
/ 26 августа 2011

У меня есть класс, содержащий вектор:

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 ]

5 голосов
/ 26 августа 2011

Вы можете сделать это:

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 голос
/ 26 августа 2011

Не на 100% тот же синтаксис, но посмотрите в list_of повышения: http://www.boost.org/doc/libs/1_47_0/libs/assign/doc/index.html#list_of

0 голосов
/ 26 августа 2011

Если вы измените типы итераторов

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

Что кажется довольно лаконичным.

0 голосов
/ 26 августа 2011

Я не знаю ни о какой функциональности буста, которая делает это (скорее всего, просто потому, что я ее еще не видел, «буст есть» - это почти аксоим ...), но вы могли бы определить функцию с вариацией Является ли. Это будет выглядеть примерно так:

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