如何创建Template-Specialization Class对象?

时间:2012-07-09 03:11:53

标签: c++ templates

我写了一个像这样的Template-Specialization Class:

template <> class MEField<SField> {....};

我想知道如何对这个类进行实例化?我看到一些代码写得像这样:MEField<> obj?是对的吗?

我知道在函数特化情况下,我可以正常进行实例化,因为编译器可以判断特殊类型的参数。但至于上课,你能告诉我真正的格式吗?

2 个答案:

答案 0 :(得分:3)

您通常会像其他模板一样MEField<SField> obj;。无论您是否具有专门的模板,该类的用户都不会感到困扰,由编译器决定使用哪个模板实例化。

答案 1 :(得分:1)

下面,

template <> class MEField<SField> {....};

你所做的是明确的专业化。正如msdn所说,

  

当实例化类或函数时,编译器为模板类或函数生成代码。

进一步指出,

  

如果模板被显式实例化或专门化一次,则无法在同一程序中为同一组模板参数第二次显式实例化或专门化它。允许使用不同模板参数的进一步特化。

所以标准的方法是这样写。

MEField<SField> obj;

但是,正如Jesse Good所说,您可以使用默认模板参数,在实例化时不需要您指定类型,因为它使用您指定的默认类型。

参考下面的代码(经过测试的代码)

class SField
{
public:
    int m_var;
    SField():m_var(0){}
};

template<typename T = SField> // Default template argument.
class MEField
{
public:
   T m_var;
};

template <>
class MEField<SField> // Explicit specialization
{
public:
   SField sField;
   void print(){ cout << sField.m_var; }
};

int main()
{
    MEField<> obj;
    obj.print();
}

另请参阅:Default Arguments for Class Templates