Шаблон внутренних классов на основе параметров - PullRequest
1 голос
/ 25 декабря 2011

У меня есть вопрос, связанный с дизайном реализации класса шаблона.

Шаблон AT может быть специализирован только с параметрами шаблона A1 и A2:

AT<A1> a;

or

AT<A2> a;

В шаблоне есть функция, которая может использовать классы B1 и B2. В частности, когда шаблон специализируется на классе A1, функция должна использовать B1, а для A2 следует использовать B2. Например:

template< class T > class AT : public A
{
  int size;

  public:
    int f()
    {
        if ( dynamic_cast<A1*> this != 0 ) {
            size = sizeof( B1 );
        }
        else {
            size = sizeof( B2 );
        }
    }

    ...
};

Поскольку B1 и B2 являются классами, связанными с внутренней реализацией A1 и A2, желательно, чтобы конечный пользователь не знал об их существовании, поэтому специализация шаблона, такая как

AT<A1, B1> a;

недопустимо.

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

Спасибо!

Ответы [ 2 ]

4 голосов
/ 25 декабря 2011

Вы можете создать черту простого типа для сопоставления типов:

template <typename T>
struct B_type;           // Generic type mapping declaration (undefined)
template <>
struct B_type<A1> {      // Mapping of A1 -> B1
   typedef B1 type;
};
template <>
struct B_type<A2> {      // Mappint of A2 -> B2
   typedef B2 type;
};

А затем использовать его внутри:

template <typename T>
int AT<T>::f() {
   return sizeof( typename B_type<T>::type );
}
0 голосов
/ 25 декабря 2011

В более простых случаях вы можете использовать черты типа.

Если вам нужно что-то более сложное, вы можете использовать приватное / защищенное наследование или просто создать специализированный объект (благодаря Дэвиду, который указал на то, что невозможно использовать класс-член), который имеет явную специализацию для A1 и A2 и который выбирает правильную функцию.

template<> class sizeofFunc<A1>
{
    public:
        static int getSize(T obj) {
            return sizeof(B1);
        }
};

template<> class sizeofFunc<A2>
{
  public:
      static int getSize(T obj) {
          return sizeof(B2);
      }
};

template< class T > class AT : public A, private sizeofFunc<T>
{
  int size;

  public:
    int f()
    {
        size = getSize(something);
    }

    ...
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...