从专用模板类函数调用非专用模板类函数

Gra*_*eme 16 c++ template-specialization

是否可以从专用模板类中调用非专用模板类中定义的函数?这是我正在尝试的一个例子:

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);
 }
};
Run Code Online (Sandbox Code Playgroud)

海湾合作委员会抱怨它看不到非专业化的阶级职能; 也就是说,我猜它只在专门的班级内看.

有什么想法吗?

编辑

以下是我的代码中的一个更具体的示例(可能的解决方案):

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);    
    }
};
Run Code Online (Sandbox Code Playgroud)

我有其他函数 - toString(),countDigits()等.我选择了这种方法,所以我可以为每种类型保留相同的函数名称(即不需要toStringU32(),toString32等).我认为模板专业化,但我不相信这是可能的.

Kon*_*lph 12

一般来说,这是不可能的.

有不同的可能解决方案,但他们"作弊".第一种是将实际的默认逻辑提升到一个专业的不同功能.现在您可以从两个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);
 }
};
Run Code Online (Sandbox Code Playgroud)