部分模板特化

7

我有一个情景,其中有一个模板类

template<typename X, typename Y>
class Foo
{
 typedef Y::NestedType Bar;

 int A (Bar thing);
 void B();
 int C(X that);

 // other stuff
};

然后,当X是给定类型时,我希望A()方法具有不同的行为(但B和C可以保持不变,实际代码实际上还有大约10个其他方法,其中一些非常冗长且经常需要调整...因此,我宁愿避免做全类专业化并复制粘贴整个类实现)

然后,我继续写道:

template<typename T>
int Foo<MyType, T>::A(Bar thing);

但是我的编译器(clang 163.7.1)拒绝将其视为任何类型的模板特化。

在我编写代码的方式中是否隐藏了某些语法错误,或者这种编码风格是否无效?不幸的是,即使其他编译器支持这个习惯用法,我的公司也被卡在clang上。

感谢您对此的任何帮助。


我不知道这是否对你有所帮助,但请记住,在C++中不允许对模板函数进行部分特化(仅允许对模板类进行)。 - Seth Carnegie
2
你必须先专门化这个类。 - Karoly Horvath
你在整个类或其函数中需要 X 的类型吗?如果不需要,你可以使用模板函数。 - David Feurle
1个回答

7

使用重载

template<typename X, typename Y>
class Foo
{
 // allows to wrap up the arguments
 template<typename, typename>
 struct Types { };

 typedef Y::NestedType Bar;

 int A (Bar thing) {
   return AImpl(thing, Types<X, Y>());
 }

 void B();
 int C(X that);

 // other stuff
private:
  template<typename X1, typename Y1>
  int AImpl(Bar thing, Types<X1, Y1>) {
    /* generic */
  }

  template<typename Y1>
  int AImpl(Bar thing, Types<SpecificType, Y1>) {
    /* special */
  }
};

您不能对类模板的成员进行部分特化。您所写的内容将是类模板本身的偏特化的成员函数A的定义。


我已经使用类层次结构解决了这个问题。我的以前的Foo类变成了类Foo_base<X,Y>。然后,我有一个类Foo<X,Y>:public Foo_base<X,Y>,它只重新定义了构造函数和赋值运算符。然后,我的部分特化内容在一个类模板专业化Foo<MyType,T>:public Foo_base<MyType,T>中,它只重新定义了其父类的A()方法(最终它所做的是{thong = Something(thing); ParentClass::A(thong);})。这需要输入相当多的内容,但可以完成工作。谢谢! - Enrico Granata
无论如何,我很想能够“部分特化类模板的成员” :-) 我不明白禁止这样做的意义。 - Enrico Granata

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接