Обход кортежа C ++ в порядке, определенном во время выполнения - PullRequest
2 голосов
/ 19 января 2012

Можно выполнять итерации для надстройки или кортежа std, но можно ли выполнять итерацию в порядке, определенном во время выполнения, при этом сохраняя информацию о типе?

Предположим, мой кортеж был заполнен объектами типа Foo:

#include <tuple>

using namespace std;

template <typename ...> void bar(); // Definition omitted.

template <typename ... Ts>
struct Foo {
  void doit() { bar<Ts...>(); }
  int rank;
};

int main(int argc, char *argv[])
{
  auto tup = make_tuple(Foo<int,double>(),
                        Foo<bool,char,float>());
  get<0>(tup).rank = 2;
  get<1>(tup).rank = 1;
  return 0;
}

Я хотел бы иметь возможность просматривать список типов Foo, вызывая их методы doit, но в произвольном порядке, определяемом, скажем, значением элемента rank.

1 Ответ

3 голосов
/ 19 января 2012

Чтобы это произошло, вам нужно будет выполнить стирание некоторого типа.Что-то вроде

template <typename ...> void bar(); // Definition omitted.

struct FooBase {
    virtual void doit() = 0;
    int rank;
};

template <typename ... Ts>
struct Foo : public FooBase {
  void doit() { bar<Ts...>(); }
};

int main(int argc, char *argv[])
{
  auto tup = make_tuple(Foo<int,double>(),
                        Foo<bool,char,float>());
  get<0>(tup).rank = 2;
  get<1>(tup).rank = 1;
  std::vector<FooBase*> bases;
  // fill bases
  // sort
  // call
  return 0;
}

Существуют и другие механизмы, которые вы можете применить, например, функциональные и не требующие изменения Foo, но все они сводятся к одному и тому же стиранию принципа.Я просто представил простейшую реализацию этого стирания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...