如何新建Template Specialization Class对象

How can I new a Template-Specialization Class object?

本文关键字:Template Specialization Class 对象 新建 何新建      更新时间:2023-10-16

我编写了一个模板专业化类,如下所示:

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

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

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

您通常会像其他模板MEField<SField> obj;一样执行此操作。类的用户并不关心您是否专门化了模板,而是由编译器决定使用模板的哪个实例化。

此处,

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();
}

另请参阅:类模板的默认参数