c++ Traits问题

来源:百度知道 编辑:UC知道 时间:2024/07/04 00:07:24
先看看一段程序:
#include <iostream>
using namespace std;

class CComplexObject // a demo class
{
public:
void clone() { cout << "in clone" << endl; }
};

// Solving the problem of choosing method to call by inner traits class
template <typename T, bool isClonable>
class XContainer
{
public:
enum {Clonable = isClonable};

void clone(T* pObj)
{
Traits<isClonable>().clone(pObj);
}

template <bool flag>
class Traits
{
};

template <>
class Traits<true>
{
public:
void clone(T* pObj)
{
cout << "before cloning Clonable type" << endl;
pObj->clone();
cout << "after cloning Clonable type" << endl;

Traits<isClonable>()实际上调用了Traits<isClonable>类的默认构造函数啊,返回的是该类的实例,然后调用了实例的clone方法.

traits的意思是特征。这里的作用是根据不同的对象的特征编译为不同的代码。
Traits<isClonable>()会根据isClonable为true或false构造不同类型的实例。它们的clone方法的实现是不同的。Traits<true>的clone是调用pObj的克隆方法,而Traits<false>则提示无法克隆(这一情况下,pObj可以没有不定义clone方法)。
这一做法的目的是,可以通过像模板传达对象的特征信息来选择编译不同的方法。

VS 2005 运行结果:
cloning non Clonable type
before cloning Clonable typ
in clone
after cloning Clonable type
=================================
Traits<isClonable>().clone()调用 template <>
class Traits<false> 或者 template <>
class Traits<true>
里面的clone. 根据isClonable的值来确定。