Это можно сделать, однако мне не очень нравится это решение.
Проблема заключается в том, что я определяю:
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 снова, даже если оно более многословно.