В приведенном ниже коде аргумент шаблона OFFSET базового класса B для C зависит от B0, а B2 - от B1.
Это делается путем ручной записи кода каждый раз, когда создается экземпляр C (в основном методе). Есть ли способ переместить эту функциональность в определение C вместо этого?
template<int OFFSET>
struct A {
enum O { offset = OFFSET };
enum S { size = 2 };
};
template<int OFFSET>
struct B {
enum O { offset = OFFSET };
enum S { size = 4 };
};
template < typename B0, typename B1, typename B2 >
struct C : public B0, B1, B2 {
};
int main(int argc, const char *argv[])
{
// instance of C
C< A<1>,
B< A<1>::offset * A<1>::size >,
A<
B< A<1>::offset * A<1>::size >::offset *
B< A<1>::offset * A<1>::size >::size
>
> c1;
// does the same thing
C< A<1>,
B< A<1>::size >,
A<
A<1>::size *
B< A<1>::size >::size
>
> c2;
return 0;
}
EDIT:
Чтобы ответить на комментарии, вот шаги, которые, я думаю, необходимо предпринять, чтобы решить эту проблему:
Напишите метафункцию, которая может изменить смещение:
set_new_offset, который для T определяет тип T <2>
Используйте boost :: mpl :: times для расчета новых смещений
Добавить еще шаблон магии ...