您的位置:首页 > 编程语言 > C语言/C++

C++模版使用技巧--Int2Type

2013-11-03 22:41 232 查看
一 Int2Type

平常我们所看到的int是一个类型,例如1,2,3...等属于int。 但是这里说的是通过模版使每一个int类型变量都当成是不同的类型。

二 C++模版的迟绑定

这个名字是我起的,因为不知道正式的称呼是什么,意思是说在使用C++的模版的时候,只有在你的代码里面调用了某个模版方法,在编译的时候才会产生对应的方法,也即编译后的代码中不包含我们没有使用的模版方法。看下面的实例是可以编译运行的:
</pre><pre class="cpp" name="code">class X {
public:
void f() {}
};

class Y {
public:
void g() {}
};

template <typename T> class Z {
T t;
public:
void a() { t.f(); }
void b() { t.g(); }
};

int main() {
Z<X> zx;
zx.a(); // Doesn't create Z<X>::b()
Z<Y> zy;
zy.b(); // Doesn't create Z<Y>::a()
}


三 问题

template <typename T, bool isPolymorphic>
class NiftyContainer
{
void DoSomething()
{
T* pSomeObj = ;
if (isPolymorphic)
{
T* pNewObj = pSomeObj->Clone();

}
else
{
T* pNewObj = new T(*pSomeObj);

}
}
};
class Test
{
public:
Test(){};
};

void main()
{
NiftyContainer<Test,true> test;
//test.DoSomething(); // 这里通不过编译

}


 

大家也许会说上面的方法代码没有问题,我说,有问题,仔细看一开始的代码和我的说明,我说的是只要我们的代码里面用到模版方法就会被编译为目标代码,而不是说在代码运行的时候使用到的代码才会被编译为目标代码,好的,搞清楚了这个就可以知道上面的实例为什么通不过编译了。

四 Int2Type

下面正式进入主题Int2Type的作用和使用,上面的实例,我们传入的T类型中只有clone或public构造函数中的一个,我们想根据bool值来选择使用clone或new,但是上面的代码有问题,编译都不过偶,下面使用Int2Type来实现:

template <int v>
struct Int2Type
{
enum { value = v };
};

template <typename T, bool isPolymorphic>
class NiftyContainer
{
private:
void DoSomething(T* pObj, Int2Type<true>)
{
T* pNewObj = pObj->Clone();

}
void DoSomething(T* pObj, Int2Type<false>)
{
T* pNewObj = new T(*pObj);

}
public:
void DoSomething(T* pObj)
{
DoSomething(pObj, Int2Type<isPolymorphic>());
}
};
class Test
{
public:
Test(){};
};
void main()
{
NiftyContainer<Test,false> test; //如果用ture不会通过编译
Test* t = new Test();
test.DoSomething(t);
}


看了上面的代码,我不禁要再次的赞叹《C++设计新思维》的作者,高!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 设计