-->

C ++分部方法专业化(C++ partial method specialization)

2019-07-21 10:05发布

是否有一个模板类方法的局部特殊化?

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

它不工作专门这样的:

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

任何帮助吗?

Answer 1:

如果你已经有专门的类,你可以给不同的实施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)。



Answer 2:

我觉得有一个误解那里。

有两种类型的模板:

  • 模板类
  • 模板方法

在你的榜样,你有一个模板类,其中当然也包含了一些方法。 在这种情况下,你将有专门的类。

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

在您的例子的问题是比较简单的:你定义了专业化C中的foo方法,但是这种专业化从未事先声明

这里的问题是,你必须完全专注你的C类(从而复制大量的数据)。 有一些变通办法。

  • 继承(组成):做一个基类所有常见的工作,然后有C级继承并酌情专业
  • 朋友:代替具有将“foo”方法是C的一员,它定义为一个朋友自由功能和专门仅此方法
  • 代表团:有你的“富”的方法调用另一个方法“酒吧”,这是一个免费的功能,并专注“酒吧”适当

这在代码给出:

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

希望它澄清,并帮助!



Answer 3:

没有,在C中没有局部功能模板特殊化++ 0X添加。

正如上面提到的正确,关于函数模板基本上2个事做完了:

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

所以像以前一样,解决方法应采用“模拟”部分函数模板专业化。



Answer 4:

由于类是模板,你需要专注的是:

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


Answer 5:

如果我没有记错,你无法对功能模板偏特。 它不知道是否包括在C ++ 0X

更新:(等待确认) 作为评价指出的,功能模板偏特能够在C ++ 0X。



文章来源: C++ partial method specialization