1

У меня есть шаблон класса 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.

К сожалению, я не могу перепроектировать, добавив третий аргумент к нему.

Есть ли другие идеи/обходные пути для такого рода проблем?

ответ

0

Что относительно этого?

template <class T> 
struct SpecialClass : T {}; 

template <class T> 
void method1024(A<B<TImpl1, TImpl2>, C<SpecialClass<T>>> a) { 
    ... 
} 

Эта перегрузка специализируется на любой SpecialClass, который, в свою очередь, является производным от другого типа, чтобы вы могли пройти C<SpecialClass<TImpl3>>, например, и ваша реализация C до сих пор было определено (с SpecialClass имеет тип TImpl3).

+0

Спасибо за ваше предложение. Извините, я не указал явно в вопросе, что TImpl1, TImpl2 и TImpl3 являются аргументами шаблона. Поскольку для TImpl3 существует несколько вариантов, я не знаю, как это могло бы работать. – hoobooda