【发布时间】:2021-09-17 17:54:27
【问题描述】:
为什么 C++ 禁止这种部分特化?
这种禁忌背后的哲学是什么,我可以接受吗?
如果没有这种禁止,编程会容易得多。
模板应防止冗余。
现在我必须为 int d = 3 的每个类 N 产生冗余。
//__________________________________________
//__________________________________________
//
template<class N, int d>
class MyClass
{
public:
void doo();
};
//__________________________________________
//__ allowed _______________________________
//
template<class N, int d>
void MyClass<N, d>::doo()
{
cout << "general";
}
//__________________________________________
//__ forbidden _____________________________
//
template<class N>
void MyClass<N, 3>::doo()
{
cout << "partial specialization";
}
【问题讨论】:
-
您正在尝试部分专门化一个函数。 C++ 只允许类的部分特化。至于基本原理,大概是因为您可以使用部分特化的类来执行函数可能具有的任何操作,并且当部分特化仅限于类时,该语言变得更容易编译。
-
使用 C++17,您可以在
doo的实现中添加一个if constexpr (d == 3),作为“专门化”单个函数的一种方式 -
@UnholySheep:对不起,我不能接受这个答案。模板应提供干净的编码,并且通过这种解决方法,我的代码变得不干净。臃肿。
不过还是谢谢你的回答。 -
@MBastieK 好吧,我可能遗漏了一些东西,但我不确定你怎么会认为answer 中的代码比其他代码更多 臃肿。我猜这是见仁见智的问题。
-
哲学? stackoverflow.com/q/13923684/817643 - 您要求 implicit 部分专业化。这为已经可以self immolate 的语言添加了油。
标签: c++ templates template-specialization partial-specialization