Контейнер типа std :: map, который отображает типы в значения - PullRequest
7 голосов
/ 20 октября 2010

Я ищу гибридный мета-контейнер / контейнерный класс.Мне нужен класс, который отображает тип времени компиляции на значение времени выполнения.Фрагмент кода стоит 1024 слова, поэтому:

struct Foo { /* ... */ };
struct Bar { /* ... */ };

int main()
{
   meta_container<Foo,float,int> mc;
   mc.get<float>() = 1.0f;
   mc.get<Foo>().method(blah);
   mc.get<Bar>(); //compiler error
}

Это действительно скучный материал.Реализация, использующая шаблоны с переменным числом аргументов, была бы достаточно интересной, но интерфейс очень прост.

Часть, которая усложняет эту задачу, - это последняя функция, которую я хочу.

void foo( const meta_constainer<Foo,Bar,Baz>& mc );

//make_mc is sorta like make_pair or make_tuple.

int main()
{
   foo( make_mc(Foo(), Bar(), Baz()) );  // not really interesting
   foo( make_mc(Bar(), Foo(), Baz()) );  // this is more challenging
   foo( make_mc(Foo()) );  // this might be difficult as well.
}

Я мог бы написать такуюконтейнер, но я хотел бы найти тот, который уже написан / отлажен.Моим самым большим камнем преткновения было отсутствие хороших ключевых слов для поиска ( гетерогенный контейнер - это не то, что мне нужно).

Существует ли библиотека Boost с таким или похожим интерфейсом?

Как называется эта вещь, чтобы я мог использовать ее более эффективно?


обновление:

Я не ищу:

  • boost::mpl::map
    Отображает значение времени компиляции на значение времени компиляции
  • std::map<*,boost::any>
    Отображает значение времени выполнения статического типа на значение времени выполнения динамического типа
  • std::map<*,boost::variadic<*>>
    Это сопоставляет статическое типизированное значение времени выполнения со значением времени выполнения типа переменной
  • std::map<typeid,boost::variadic<*>>
    Это близко к тому, что я хочу, за исключением того, что оно использует RTTI и не являетсяошибка компиляции при обращении с неверным типом.

1 Ответ

3 голосов
/ 20 октября 2010
...