Здравствуйте!
Есть шаблонный класс с шаблонными функциями. Хочу специализировать функции по их шаблонному аргументу, но чтобы они остались шаблонными по параметру шаблона класса.
И сам делал такое, но довольно нечасто и давно, и совсем позабыл, что к чему.
Вот, думаю, может, местный коллективный разум быстрее поможет, чем гугл
UPD: что-то типа такого:
template< typename RegTableImpl >
template<>
inline
uint32_t RegTable<RegTableImpl>::getRegValue<uint32_t>( const TypedIndex<uint32_t> regId )
//...
Но так не работает
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.
Обычно обходится созданием внутренней дамми-структуры и статического метода в ней, с последующей частичной специализацией самой структуры.
Здравствуйте, 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>Обычно обходится созданием внутренней дамми-структуры и статического метода в ней, с последующей частичной специализацией самой структуры.
Ок, спс
Здравствуйте, Marty, Вы писали:
M>Есть шаблонный класс с шаблонными функциями. Хочу специализировать функции по их шаблонному аргументу, но чтобы они остались шаблонными по параметру шаблона класса.
M>И сам делал такое, но довольно нечасто и давно, и совсем позабыл, что к чему.
Вероятно, ты делал специализацию для шаблонных функций НЕшаблонного класса. А то, что ты хочешь — это не что иное, как частичная специализация шаблонных функций(членов), которая никогда не поддерживалась раньше, не поддерживается и сейчас.
Поэтому в тех случаях, когда это возможно, следует предпочитать перегрузки специализациям и тогда эта проблема уходит автоматически. Но бывает так, что параметр шаблона не связан с формальными параметрами функции и/или не выводится из них автоматически. На этот случай тоже есть типовые решения:
Способ первый — реализация шаблонной функции через шаблонный класс. И тогда частичная специализация делается уже для класса, а не для функции:
https://ideone.com/FNbuG3
Другой способ — добавление к списку формальных параметров функции дополнительного фейкового параметра, производного от типа, по которому требуется сделать специализацию:
https://ideone.com/CRgCQU.
Здравствуйте, 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) {...}
...
};