У меня есть шаблон класса A, который выглядит так. Рассмотрим TImpl1 и TImpl2 в качестве аргументов, которые определяют реализации абстрактных типов данных B и C, чтобы решить проблему, которая относится к:Специализированные вложенные шаблоны
template <typename TImpl1, typename TImpl2, typename TImpl3>
A<B<TImpl1, TImpl2>, C<TImpl3> >
У меня также есть много функций, не являющихся членами, которые получают экземпляр A, звоните друг другу и делайте что-то с A. Теперь я хочу изменить спецификацию одного метода для определенного типа A-классов, которые я собираюсь представить.
Самый простой способ: я ввожу пустой-структуру «SpecialClass» и сделать частичную специализацию:
struct SepcialClass;
// method already existed
template <typename TImpl1, typename TImpl2, typename TImpl3>
method1024(A<B<TImpl1, TImpl2>, C<TImpl3> > a) {
...
}
// new method for only some
template <typename TImpl1, typename TImpl2>
method1024(A<B<TImpl1, TImpl2>, C<SpecialClass> > a) {
...
}
Поэтому, когда я объявляю A<B<...>,C<SpecialClass> >
все методы запуска правильно и method1024 специализированный один выбран.
Это полностью работает, но: я потерял Possiblity указать реализацию C.
К сожалению, я не могу перепроектировать, добавив третий аргумент к нему.
Есть ли другие идеи/обходные пути для такого рода проблем?
Спасибо за ваше предложение. Извините, я не указал явно в вопросе, что TImpl1, TImpl2 и TImpl3 являются аргументами шаблона. Поскольку для TImpl3 существует несколько вариантов, я не знаю, как это могло бы работать. – hoobooda