Этот вопрос предназначен для C++ 03, а не C++ 11.Устранение избыточности с использованием CRTP и множественного наследования
У меня есть случай, когда я использую CRTP с множественным наследованием, и мне любопытно узнать, есть ли способ удалить избыточность, которая создается при указании типа B
ниже.
#include "boost/typeof/typeof.hpp"
#include "boost/units/detail/utility.hpp"
#include <iostream>
#include <string>
struct One{};
struct Two{};
template<typename T>
struct Type
{
static std::string name(void)
{
return boost::units::detail::demangle(typeid(T).name());
}
};
template<typename T1,
typename T2>
struct A
{
typedef A<T1, T2> Self;
A()
{
std::cout << Type<Self>::name() << std::endl;
}
};
template<typename T1,
typename T2,
typename T3>
struct B : public A<One, B<T1, T2, T3> >, // The B<T1, T2, T3> here is redundant
public A<Two, B<T1, T2, T3> >
{
typedef B<T1, T2, T3> Self;
B()
{
std::cout << Type<Self>::name() << std::endl;
}
};
int main(int argc, char* argv[])
{
B<int, int, int> t;
return 0;
}
Смотреть это на Coliru
Проблема ухудшается, когда число параметров шаблона для B
увеличивается, когда аргументы шаблона сами являются сложными, и когда B
унаследован от более A
раз. Я хотел бы свести к минимуму повторение параметров шаблона B
. В частности, я ищу способ получить доступ к typedef B<T1, T2, T3> Self
в списке наследования для B
или некоторой эквивалентной версии времени компиляции this
.
не могу:
- Сделать ЬурейиЙ для
B
вышеB
с использованием прямого заявления, потому что у меня нет доступа к шаблону параметры - Сделать ЬурейуЮ внутри определения наследования, потому что синтаксис не позволяет этого
- Доступ к typedef изнутри класса, поскольку он еще не существует
Что-то вроде ниже (ни один из которых не правильный код, но отобразить эффект, я ищу):
template<typename T1,
typename T2,
typename T3>
struct B : public A<One, Self>, // Cannot access the typedef yet
public A<Two, Self>
{
typedef B<T1, T2, T3> Self;
};
template<typename T1,
typename T2,
typename T3>
struct B : typedef B<T1, T2, T3> Self, // Invalid syntax
public A<One, Self>,
public A<Two, Self>
{
};
template<typename T1,
typename T2,
typename T3>
struct B : public A<One, B>, // I wish this would work
public A<Two, B>
{
};
template<typename T1,
typename T2,
typename T3>
struct B : public A<One, BOOST_TYPEOF(*this)>, // lol
public A<Two, BOOST_TYPEOF(*this)>
{
};
Есть ли способ получить доступ к времени компиляции версии this
?
Как насчет использования вложенного типа/метафайла? 'template struct M {struct B: A , A {}; }; 'Использование, конечно, не так хорошо в C++ 03 из-за отсутствия шаблонов псевдонимов, но из него можно извлечь:' template struct C: typename M :: B {}; ' –
dyp