У меня следующая проблема:
Предположим, у меня есть какой-то базовый счетчик class Counter
. И предположим, что у нас также есть несколько наборов классов, которые можно сосчитать. Давайте назовем некоторые из них class CountedA
и class CountedB
.
Теперь каждый класс, который может быть подсчитан (например, CountedA
и CountedB
) , имеет следующие статически объявленные части: one enum
и одна int
часть, который действует как часть подсчитанных данных .
Например, это объявление может выглядеть следующим образом:
enum CountedType { A, B };
template <CountedType Type, int N>
class Counted { };
// Now we can declare 'CountedA' and 'CountedB'
typedef Counted<A, 25> CountedA;
typedef Counted<B, 7> CountedB;
Теперь объявление счетчика:
// C++0x variadic or simply bunch of 'typename XX' definitions for C++03
template <typename T0, typename T1, typename ...>
class Counter
{
// I don't know how to implement this
// for now!
int GetTotalN() { ... }
// Retrieve the corresponding type
// so that GetTypeAt<0> returns
// enum from 'T0'
template <int Pos>
CountedType GetTypeAt() { ... }
};
Я хочу написать что-то вроде:
class RealCounter : public Counter<CountedA, CountedB> { };
И используйте его следующим образом:
RealCounter counter;
int n = counter.GetTotalN();
CountedType type = counter.GetTypeAt<0>();
Теперь я почти уверен, что это можно сделать. Но как лучше всего это реализовать? (не спрашивайте меня, зачем мне такие безумные вещи:)
boost::mpl
предлагает что-нибудь для этого случая?
Спасибо.
Небольшое обновление:
В этом конкретном примере GetTotalN()
должно вернуть 25 + 7
.
Если мы добавим, например, typedef Counted<C, 2> CountedC
, то результат для
RealCounter : public Counter<CountedA, CountedB, CountedC>
должно стать 25 + 7 + 2
.