如何制作以下代码在课外进行外部化:
template<typename TemplateItem>
class TestA
{
operator const int (){return 10;}
};
所以看起来像是:
template<typename TemplateItem>
class TestA
{
operator const int ();
};
template<>
TestA<int>::operator const int()
{
//etc etc
}
所以我可以专门针对不同模板类型的函数吗?
答案 0 :(得分:5)
写下这个:
template <typename T> class TestA
{
operator const int();
};
template <typename T> TestA<T>::operator const int()
{
return 10;
}
顺便说一句,“内联”的标准反义词通常是“脱节”。另外,我可能会创建函数const
,就像通常使用转换运算符一样(允许来自常量对象的转换)。
您既可以专门化整个类,也可以只使用成员函数。仅对于成员函数,请写下:
template <> TestA<int>::operator const int() { /* ... */ }
对于整个类的专业化,语法是:
template <> class TestA<int>
{
operator const int();
};
TestA<int>::operator const int() { /*...*/ }
答案 1 :(得分:1)
我认为你不能专门化模板类的非模板函数而不专门化整个类。这意味着你必须作弊。简化方法是将大部分实现移动到“Base”类(两者共享的所有内容),并使TestA从该基类继承,并仅定义需要专门化的函数。
//general base
template<typename TemplateItem>
class TestABase
{
protected:
TemplateItem data;
};
//non specialized members
template<typename TemplateItem>
class TestA: public TestABase<TemplateItem>
{
public:
operator const int ();
};
//specialized members
template<>
class TestA<int> : public TestABase<TemplateItem>
{
public:
operator const int ();
};
//implementations
template<typename TemplateItem>
TestA<TemplateItem>::operator const int()
{
return data;
}
template<>
TestA<int>::operator const int()
{
return data;
}
答案 2 :(得分:1)
首先,声明并定义主要模板,如下所示:
template<typename T>
class TestA
{
public:
operator int() const;
};
template<typename T>
TestA<T>::operator int() const
{
return -1;
}
关于特化,C ++ 03标准§14.5.1.1/ 1告诉我们,类模板的非模板成员函数(和构造函数!)本身被认为是函数模板:
类模板的成员函数可以在声明它的类模板定义之外定义。 [示例:的
template<class T> class Array { T* v; int sz; public: explicit Array(int); T& operator[](int); T& elem(int i) { return v[i]; } // ... };
声明三个函数模板。下标函数可能定义如下:
template<class T> T& Array<T>::operator[](int i) { if (i<0 || sz<=i) error("Array: range error"); return v[i]; }
- 示例]
因此,它们可以是专门的而不用也专门化其他主要类模板(不像你专门化,明确或部分地,类模板本身):
template<>
TestA<int>::operator int() const
{
return 5;
}
template<>
TestA<double>::operator int() const
{
return 3;
}
<强> Full demo 强>