11

模板类方法是否有部分专业化?

 template <class A, class B>
 class C
 {
  void foo();
 }

像这样专门化它是行不通的:

template <class A> void C<A, CObject>::foo() {};

有什么帮助吗?

4

5 回答 5

12

如果您已经有专门的课程,您可以foo在专门的课程中给出不同的实现:

template<typename A, typename B>
class C
{
public:
    void foo() { cout << "default" << endl; };
};

template<typename A>
class C<A, CObject>
{
public:
  void foo() { cout << "CObject" << endl; };
};

要专门化 Visual C++ 2008 中的成员函数,您也可以将其设为模板:

template<typename A, typename B>
class C
{
  template<typename T>
  void foo();

  template<>
  void foo<CObject>();
};

上述解决方案似乎仅在未来的 C++ 标准中可用(根据草案 n2914 14.6.5.3/2)。

于 2009-10-08T05:56:57.650 回答
8

我认为那里存在误解。

有两种模板:

  • 模板类
  • 模板方法

在您的示例中,您有一个模板类,其中当然包含一些方法。在这种情况下,您将不得不专攻该课程。

template <class A>
class C<A,CObject>
{
  void foo() { ... } // specialized code
};

您的示例中的问题相对简单:您为专业化 C定义了方法 foo 但从未事先声明过此专业化。

这里的问题是您必须完全专门化您的 C 类(并因此复制大量数据)。有许多解决方法。

  • 继承(组合?):在基类中完成所有常见工作,然后让 C 类继承并酌情进行专门化
  • Friend:不要让 'foo' 方法成为 C 的成员,而是将其定义为友元自由函数并仅专门化此方法
  • 委托:让你的 'foo' 方法调用另一个方法 'bar',这是一个自由函数,并适当地专门化 'bar'

在代码中给出:

// 1- Inheritance
template <class A, class B>
class CBase
{
  // Everything that does not require specialization
};

template <class A, class B>
class C: public CBase<A,B>
         // depending on your need, consider using another inheritance
         // or even better, composition
{
  void foo(); // generic
};

template <class A>
class C<A,CObject> : public CBase<A,CObject>
{
  void foo(); // specialized
};

// 2- Friend
// note the change in signature:
// - now you need to pass the attributes to be changed
// - the last parameter helps differentiating the overload
//   as there is no specialization for functions
template <class A, class B> void foo(Arg1&, Arg2&, const B&);
template <class A> void foo(Arg1&, Arg2&, const CObject&);

template <class A, class B>
class C
{
  friend template <class, class> foo;
};

// 3- Delegation
// same signature as foo in (2)
template <class A, class B> void bar(Arg1&, Arg2&, const B&);
template <class A> void bar(Arg1&, Arg2&, const CObject&);

template <class A, class B>
class C
{
  void foo() { bar(member1, member2, B()); }
};

希望它澄清,并有所帮助!

于 2009-10-08T06:23:39.120 回答
2

不,没有要添加的 C++0x 中的偏函数模板特化。

正如上面正确提到的,关于功能模板,基本上做了两件事:

  • 默认模板参数可用;
  • 引入了可变参数模板。

所以和以前一样,应该使用变通方法来“模拟”部分函数模板的专门化。

于 2009-10-14T07:20:48.513 回答
1

由于类是模板,因此您需要专门化:

template <class A>
class C<A, CObject> 
{
   void foo() { ... }
}
于 2009-10-08T05:51:23.270 回答
0

如果我没记错的话,你不能对函数进行部分模板特化。不确定它是否包含在 C++0X 中

更新:( 等待确认)如评论中所述,在 C++0X 中可以对函数进行部分模板特化。

于 2009-10-08T05:53:31.490 回答