微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 从专门的模板类函数调用非专门的模板类函数

可以从专门的模板类调用非专门的模板类中定义的函数吗?以下是我正在尝试的例子:
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等).我认为模板专业化,但我不相信这是可能的.

解决方法

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

有不同的可能的解决方案,但他们“欺骗”.第一个是将实际的认逻辑提升为不专业的不同功能.现在您可以从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,str);
 }
};

原文地址:https://www.jb51.cc/c/115936.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐