为什么不使用特化的模板

cyclejdm 2013-11-08 04:24:19
首先定义了一个访问器类模板

template<typename _Ty,typename _type>
class MemberWrap
{
public:
MemberWrap(){}
MemberWrap(const _Ty& mem):m_mem(mem){}
MemberWrap& operator=(const MemberWrap& rhs)
{
if(this == &rhs)
{
return *this;
}
m_mem = rhs.get();
return *this;
}
const _Ty& get()const
{
return m_mem;
}
void set(const _Ty& mem)
{
m_mem = mem;
}
private:
_Ty m_mem;
};

然后定义了一些辅助宏

#define GENERATE_MEMBER(classtype,membername,membertype) class classtype##membertype##membername{};\
MemberWrap<membertype,classtype##membertype##membername> membername

#define GENERIC_SPECIFIEC_BEGIN(classtype,membername,membertype) template<>\
class MemberWrap<classtype,classtype::classtype##membertype##membername>\
{\
public:\
MemberWrap(){}\
MemberWrap(membertype &mem):membername(mem){}\
MemberWrap& operator=(const MemberWrap& rhs)\
{\
if(this == &rhs)\
{\
return *this;\
}\
membername = rhs.get();\
return *this;\
}
#define GENERIC_SPECIFIEC_END(membertype,membername) private:\
membertype membername;\
};


代码如下:

class M
{
public:
M()
{
}
GENERATE_MEMBER(M,m_strMeb,string);
};

GENERIC_SPECIFIEC_BEGIN(M,m_strMeb,string)
string get()const
{
return "it is specifiec";
}
void set(string mem)
{
m_strMeb = mem;
}
GENERIC_SPECIFIEC_END(string,m_strMeb)

int main()
{
M sm;
sm.m_strMeb.set("hello world");
cout << sm.m_strMeb.get()<<endl;
return 0;
}

为什么编译的时候没有采用string特化版本的MemberWrap呢?程序始终输出"hello world".
...全文
240 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2013-11-10
  • 打赏
  • 举报
回复
引用 4 楼 taodm 的回复:
为了个小语法糖,搞成了瞎折腾,得不足偿。
别定义太复杂的红,太复杂了很容易把自己搞晕
menzi11 2013-11-09
  • 打赏
  • 举报
回复
我的天啊!!!!!!!! 终于知道为什么有人讨厌C++了!!!!!!!!
taodm 2013-11-09
  • 打赏
  • 举报
回复
为了个小语法糖,搞成了瞎折腾,得不足偿。
qq120848369 2013-11-09
  • 打赏
  • 举报
回复
好吧, 我真的不太建议在C++里用宏.
sniffer12345 2013-11-09
  • 打赏
  • 举报
回复
为了一个get set,搞这样复杂的代码。。
飞天御剑流 2013-11-08
  • 打赏
  • 举报
回复
你的代码问题比较多,偶就不一一指出了,修改后的代码如下:

template<typename _Ty,typename _type>
class MemberWrap
{
public:
    MemberWrap() {}
    MemberWrap(const _Ty& mem):m_mem(mem) {}
    MemberWrap& operator=(const MemberWrap& rhs)
    {
        if(this == &rhs)
        {
            return *this;
        }
        m_mem = rhs.get();
        return *this;
    }
    const _Ty& get()const
    {
        return m_mem;
    }
    void set(const _Ty& mem)
    {
        m_mem = mem;
    }
private:
    _Ty m_mem;
};

#define GENERATE_MEMBER(classtype,membername,membertype) class classtype##membertype##membername{};\
                                        MemberWrap<membertype,classtype::classtype##membertype##membername> membername

#define GENERIC_SPECIFIEC_BEGIN(classtype,membername,membertype) template< typename T >\
                                            class MemberWrap<membertype, T >\
                                            {\
                                            public:\
                                                MemberWrap(){}\
                                                MemberWrap(membertype &mem):membername(mem){}\
                                                MemberWrap& operator=(const MemberWrap& rhs)\
                                                {\
                                                    if(this == &rhs)\
                                                    {\
                                                        return *this;\
                                                    }\
                                                    membername = rhs.get();\
                                                    return *this;\
                                                }
#define GENERIC_SPECIFIEC_END(membertype,membername) private:\
                                                membertype membername;\
                                            };

GENERIC_SPECIFIEC_BEGIN(M,m_strMeb,string)
string get()const
{
    return "it is specifiec";
}
void set(string mem)
{
    m_strMeb = mem;
}
GENERIC_SPECIFIEC_END(string,m_strMeb)

class M
{
public:
    M()
    {
    }
    GENERATE_MEMBER(M,m_strMeb,string);
};

int main( void )
{
    M sm;
    sm.m_strMeb.set("hello world");
    cout << sm.m_strMeb.get()<<endl;
    return 0;
}

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧