Специализация шаблонной функции шаблонного класса, подскажит
От: Marty Пират  
Дата: 10.07.19 22:25
Оценка:
Здравствуйте!

Есть шаблонный класс с шаблонными функциями. Хочу специализировать функции по их шаблонному аргументу, но чтобы они остались шаблонными по параметру шаблона класса.
И сам делал такое, но довольно нечасто и давно, и совсем позабыл, что к чему.

Вот, думаю, может, местный коллективный разум быстрее поможет, чем гугл

UPD: что-то типа такого:
template< typename RegTableImpl >
template<>
inline
uint32_t RegTable<RegTableImpl>::getRegValue<uint32_t>( const TypedIndex<uint32_t> regId )
//...


Но так не работает
Вам как-бы показали сцыкливое мурло российской оппозиции — вот оно
Автор: Министр Промышленности
Дата: 17.10 22:57
!
Отредактировано 10.07.2019 22:53 Marty . Предыдущая версия .
Re: Специализация шаблонной функции шаблонного класса, подскажит
От: Vamp Россия  
Дата: 11.07.19 01:22
Оценка:
M>И сам делал такое, но довольно нечасто и давно, и совсем позабыл, что к чему.
Не думаю, что ты такое делал.

M>Но так не работает

Конечно не работает. См. C++ Standard, 13.8.3/19 (в последнем черновике, более ранние версии содержат примерно такой же текст):

In an explicit specialization declaration for a member of a class template or a member template that appears in namespace scope, the member template and some of its enclosing class templates may remain unspecialized, except that the declaration shall not explicitly specialize a class member template if its enclosing class templates are not explicitly specialized as well.


Обычно обходится созданием внутренней дамми-структуры и статического метода в ней, с последующей частичной специализацией самой структуры.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Специализация шаблонной функции шаблонного класса, подскажит
От: Marty Пират  
Дата: 11.07.19 06:20
Оценка:
Здравствуйте, Vamp, Вы писали:

M>>И сам делал такое, но довольно нечасто и давно, и совсем позабыл, что к чему.

V>Не думаю, что ты такое делал.

Ну, как-то выкручивался


M>>Но так не работает

V>Конечно не работает. См. C++ Standard, 13.8.3/19 (в последнем черновике, более ранние версии содержат примерно такой же текст):

V>

V>In an explicit specialization declaration for a member of a class template or a member template that appears in namespace scope, the member template and some of its enclosing class templates may remain unspecialized, except that the declaration shall not explicitly specialize a class member template if its enclosing class templates are not explicitly specialized as well.


V>Обычно обходится созданием внутренней дамми-структуры и статического метода в ней, с последующей частичной специализацией самой структуры.


Ок, спс
Вам как-бы показали сцыкливое мурло российской оппозиции — вот оно
Автор: Министр Промышленности
Дата: 17.10 22:57
!
Re: Специализация шаблонной функции шаблонного класса, подск
От: rg45 СССР  
Дата: 11.07.19 09:40
Оценка: 6 (1)
Здравствуйте, Marty, Вы писали:

M>Есть шаблонный класс с шаблонными функциями. Хочу специализировать функции по их шаблонному аргументу, но чтобы они остались шаблонными по параметру шаблона класса.

M>И сам делал такое, но довольно нечасто и давно, и совсем позабыл, что к чему.

Вероятно, ты делал специализацию для шаблонных функций НЕшаблонного класса. А то, что ты хочешь — это не что иное, как частичная специализация шаблонных функций(членов), которая никогда не поддерживалась раньше, не поддерживается и сейчас.

Поэтому в тех случаях, когда это возможно, следует предпочитать перегрузки специализациям и тогда эта проблема уходит автоматически. Но бывает так, что параметр шаблона не связан с формальными параметрами функции и/или не выводится из них автоматически. На этот случай тоже есть типовые решения:

Способ первый — реализация шаблонной функции через шаблонный класс. И тогда частичная специализация делается уже для класса, а не для функции: https://ideone.com/FNbuG3

Другой способ — добавление к списку формальных параметров функции дополнительного фейкового параметра, производного от типа, по которому требуется сделать специализацию: https://ideone.com/CRgCQU.
--
Самая страшная мафия это дураки — у них везде свои люди.
Отредактировано 11.07.2019 11:54 rg45 . Предыдущая версия . Еще …
Отредактировано 11.07.2019 11:48 rg45 . Предыдущая версия .
Отредактировано 11.07.2019 11:40 rg45 . Предыдущая версия .
Отредактировано 11.07.2019 11:38 rg45 . Предыдущая версия .
Отредактировано 11.07.2019 11:08 rg45 . Предыдущая версия .
Отредактировано 11.07.2019 10:15 rg45 . Предыдущая версия .
Отредактировано 11.07.2019 9:43 rg45 . Предыдущая версия .
Re: Специализация шаблонной функции шаблонного класса, подскажит
От: so5team https://stiffstream.com
Дата: 11.07.19 11:13
Оценка: 4 (1)
Здравствуйте, Marty, Вы писали:

M>UPD: что-то типа такого:

M>
M>template< typename RegTableImpl >
M>template<>
M>inline
M>uint32_t RegTable<RegTableImpl>::getRegValue<uint32_t>( const TypedIndex<uint32_t> regId )
M>//...
M>


А почему вы в своем RegTable<T> не можете сделать просто перегрузку getRegValue для uint32_t?
template< typename RegTableImpl >
class RegTable {
public:
  template< typename K >
  K getRegValue(const TypedIndex<K> regId) {...}

  uint32_t getRegValue(const TypedIndex<uint32_t> regId) {...}
  ...
};
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.