2

boost または std タプルを反復することは可能ですが、型情報を保持しながら、実行時に決定された順序で反復することはできますか?

私のタプルが type のオブジェクトで満たされているとします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メンバーの値などによって定義された任意の順序で行います。

4

1 に答える 1

3

これを実現するには、型消去を実装する必要があります。の線に沿った何か

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 を変更する必要のない適用可能なメカニズムは他にもありますが、それらはすべて同じ原則タイプの消去に要約されます。その消去の最も簡単な実装を提供しただけです。

于 2012-01-18T22:48:21.367 に答える