如何将转换运算符外部化?

时间:2011-10-06 20:46:58

标签: c++ class

如何制作以下代码在课外进行外部化:

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
}

所以我可以专门针对不同模板类型的函数吗?

3 个答案:

答案 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