35得票7回答
CRTP和多级继承

我的一个朋友问我怎样使用CRTP来替换多层继承中的多态。更具体地说,就像这种情况:struct A { void bar() { // do something and then call foo (possibly) in the derived class: foo(...

28得票3回答
静态多态性的定义和实现

我对所谓的静态多态性概念有一些疑问; 你可以以C++为主要背景进行解释,但如果适用的话,我会感激语言无关的答案(因此标记了C++和语言无关)。通常我们如何定义静态多态性?例如,我认为C++中的std::sort函数应视为具有静态多态性,因为它依赖于某些对象提供的接口,这些对象像迭代器一样工作,...

18得票4回答
C++中的动态多态性和静态多态性:哪种更可取?

我知道动态/静态多态取决于应用程序的设计和要求。然而,如果可能的话,总是选择静态多态是否明智?特别是在我的应用程序中,我可以看到以下两种设计选择,这两种选择似乎都不被建议: 1. 使用CRTP实现静态多态:没有vtable查找开销,同时提供模板基类形式的接口。但是,使用大量switch和st...

15得票3回答
为什么在使用模板进行静态分派时不需要前向声明?

我正在尝试使用静态多态性,调用一个函数,该函数在内部根据初始参数的类型调用“正确”的专门函数(基本上是进行标记)。以下是代码: #include <iostream> using namespace std; // tags struct tag1{}; struct ta...

13得票5回答
C++中存在真正的静态多态吗?

这里是一个简单的C++代码: #include <iostream> #include <typeinfo> template<typename T> void function() { std::cout << typeid(T).n...

12得票2回答
有没有一种通用的方法可以将函数模板改造成多态函数对象?

我有一些函数模板,例如: template <typename T> void foo(T); template <typename T> void bar(T); // others 我需要将每个参数传递给一个算法,该算法会使用不同的类型进行调用,例如: ...

10得票3回答
使用CRTP静态多态性模拟纯虚函数是否可行?

我正在尝试使用CRTP实现编译时多态,并希望强制派生类实现该函数。 当前的实现方式如下。template <class Derived> struct base { void f() { static_cast<Derived*>(this)-...

10得票2回答
策略模式与CRTP静态多态之间有什么区别?

我想要一个可以有多种可能实现的接口,并且可以在编译时进行选择。我看到CRTP是实现这一目标的首选习惯用语。为什么会是这样?另一种替代方案是策略模式,但是我在任何地方都没有看到提及这种技术:template <class Impl> class StrategyInterface {...

9得票2回答
CRTP是否没有编译时检查?

我尝试使用“奇异递归模板模式”来实现静态多态性,但注意到static_cast<>通常在编译时检查一个类型是否能够转换成另一个类型,却未能检查基类声明中的打字错误,从而允许将基类向下转型为其任意子类: #include <iostream> using namesp...

8得票5回答
C++中的静态鸭子类型

C++在给定模板参数类型时有某种鸭子类型。我们不知道DUCK1和DUCK2会是什么类型,但只要它们能quack(),就可以编译和运行: template <class DUCK1, class DUCK2> void let_them_quack(DUCK1* donald, D...