【发布时间】:2017-10-05 12:37:57
【问题描述】:
在工作中,我遇到过基本上是这样的代码:
#include <iostream>
using namespace std;
enum e_Specialization {
Specialization_A,
Specialization_B
};
template<e_Specialization>
class TemplatedBase {
public:
string foo() { return "TemplatedBase::foo"; }
};
template<>
string TemplatedBase<Specialization_A>::foo() { return "TemplatedBase<Specialization_A>:foo"; }
int main() {
TemplatedBase<Specialization_A> o;
cout << o.foo() << endl;
return 0;
}
哪个输出
TemplatedBase<Specialization_A>:foo
我无法在任何地方找到有关此技术的任何讨论。
代码的创建者主要从事物的优化方面争辩说,不会发生虚拟调度。在我们的例子中,这种优化不是必需的,但我知道它有什么用处。
我的问题是:
-
这种技术在任何地方都有记录吗?它有名字吗?
-
与继承的特化相比,这有什么优势吗?
3.这与 CRTP 有何关系?在我看来,CRTP 的所有优点和缺点似乎都是一样的。
【问题讨论】:
-
我不明白这怎么能达到和CRTP一样的效果。
-
优势,相比什么?很难说什么是优势,什么不是。你建议什么替代方案?此外,您的唯一实现非常简单。 foo 有一个默认实现真的很重要吗?有多少功能?等等。
-
@cpplearner:这两种技术都实现了静态多态性,即无需虚拟化
-
"消除对虚拟的需要" CRTP 并没有消除对虚拟调度的需要。它使您可以方便地表达首先不需要虚拟调度的设计。
-
@schieferstapel 重复多次的误解不会成为现实。 CRTP 只允许在最初不需要它的情况下绕过虚拟调度。具体来说,当对象的类型在编译时已知时。
标签: c++ templates virtual-functions