Аргументы шаблона - PullRequest
       12

Аргументы шаблона

2 голосов
/ 10 августа 2010

У меня есть ClassA<ARG_TYPE> и ClassB<ARG_TYPE>. Теперь я хочу использовать ClassC, у которого есть общие ARG_TYPE и упомянутые классы в качестве аргументов шаблона.

ClassC<ARG_TYPE, ClassA<ARG_TYPE>, ClassB<ARG_TYPE>> легко.

Но возможно ли объявить ClassC<ARG_TYPE, ClassA, ClassB>, чтобы классы A и B могли использовать ARG_TYPE в качестве аргумента шаблона?

Ответы [ 2 ]

5 голосов
/ 10 августа 2010

Да, это можно сделать с помощью «аргументов шаблона шаблона».

Объявите ClassC следующим образом:

template<typename Arg, 
    template<typename T_Arg> class T_ClassA, 
    template<typename T_Arg> class T_ClassB>
class ClassC
{
   typedef T_ClassA<Arg> MyClassA;
   typedef T_ClassB<Arg> MyClassB;

   // Use MyClassA and MyClassB
}; 

Используйте

ClassC<Arg, ClassA, ClassB> 

и это должно работать нормально.

0 голосов
/ 10 августа 2010

Это можно сделать, однако мне не очень нравится это решение.

Проблема заключается в том, что я определяю:

template <class Arg, class Policy> class Polymorph;

, что является обобщением вашего MyClassAтипа, но поведение которого можно изменить (во время компиляции) с помощью политик (например, Allocator для стандартного контейнера).

Тогда я просто не могу использовать ваш интерфейс, потому что мой класс принимает2 параметра, в то время как ваша спецификация работает только с одним ...

Поэтому я предпочитаю первый подход, даже если он немного более многословен.Чтобы извлечь выгоду из обоих, у вас есть 2 решения (оба, включающие типизацию по утке):

  • вы просто определяете первый класс, используя первый подход, а затем второй класс, используя второй подход, который передаеттеперь заверши) аргументы к первому.Таким образом, люди с шаблонными классами, которые не соответствуют вашим требованиям, все равно смогут извлечь выгоду из вашей работы.
  • Пользователь должен предоставить тип утки для своего класса, чтобы он создал класс с одним аргументомиз нескольких аргументов класса.Наследование и шаблон не очень хорошо сочетаются, хотя это может вызвать проблемы, и я предпочел бы предыдущую идею (обременительную для автора библиотеки).

Это меняется с появлением C ++ 0x: позднее решение становится typedef с шаблоном, который работает намного лучше:)

Вот пример на C ++ 0x:

template <class Arg, template <class> class ClassA>
struct MyTemplate
{
  typedef ClassA<Arg> classA_type;
};

template <class Arg, class Policy> class Polymorph;

// C++0x required for following declaration
template <class Arg>
typedef Polymorph<Arg, ConservativePolicy> ConservativePolymorph;

typedef MyTemplate<int, ConservativePolymorph> MyTemplateC;

Если у вас нет C ++0x доступно, избегайте этого и используйте STL снова, даже если оно более многословно.

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