Вызвать неспециализированную функцию класса шаблона из специализированной функции класса шаблона
Можно ли вызвать функцию, определенную в неспецифическом классе шаблонов, из специализированного класса шаблона? Вот пример того, что я пытаюсь:
template <typename T>
struct Convert
{
static inline void toString(unsigned num, unsigned places, std::string& str) { ... }
};
template <>
struct Convert<int8_t>
{
static inline void toString(unsigned num, std::string& str)
{
Convert<int8_t>::toString(num, digitis(num), str);
}
};
GCC жалуется, что не видит неспецифическую функцию класса; т.е. я предполагаю, что он только просматривает специализированный класс.
Любые мысли?
ИЗМЕНИТЬ
Вот более конкретный пример из моего кода (с возможным решением):
struct NonSpecial { };
template <typename T>
class Convert
{
template <typename R>
static inline R fromString(const register char *str, const unsigned str_len)
{
R result = 0;
//convert str to R
return result;
}
friend class Convert<int8_t>;
friend class Convert<uint8_t>;
}
template <>
struct Convert<int8_t>
{
static inline int8_t fromString(const register char* str, const unsigned str_len = 4)
{
Convert<NonSpecial>::fromString<int8_t>(str, str_len);
}
};
template <>
struct Convert<uint8_t>
{
static inline uint8_t fromString(const register char* str, const unsigned str_len = 3)
{
Convert<NonSpecial>::fromString<uint8_t>(str, str_len);
}
};
У меня есть другие функции: toString(), countDigits() и т.д. Я выбрал этот подход, чтобы я мог хранить одни и те же имена функций для каждого типа (т.е. не нужно toStringU32(), toString32 и т.д.). Я рассмотрел типовую специализацию, но я не считаю, что это возможно.
Ответы
Ответ 1
В общем, это невозможно.
Существуют разные возможные решения, но они "обманывают". Первый заключается в том, чтобы вытащить фактическую логику по умолчанию в другую функцию, которая не является специализированной. Теперь вы можете вызвать эту функцию из обеих реализаций toString
.
Вторая альтернатива предполагает наследование от неспецифического класса и передачу специального тега в качестве аргумента шаблона:
struct BaseClassTag { };
template <>
struct Convert<int8_t> : public Convert<BaseClassTag>
{
typedef Convert<BaseClassTag> TBase;
static inline void toString(unsigned num, std::string& str)
{
TBase::toString(num, digitis(num), str);
}
};