【发布时间】:2013-10-07 05:24:30
【问题描述】:
我正在尝试构建一个通用算法。到目前为止,我已经使用类层次结构和指针实现了这一点,如下例所示:
struct Base{
virtual double fn(double x){return 0;}
};
class Derived : public Base{
double A;
public:
Derived(double a) : A(a) {}
double fn(double x) { return A*x;}
};
//Some other implementations
class algo{
double T;
std::unique_ptr<Base> b_ptr;
public:
algo(double t, std::unique_ptr<Base>& _ptr); //move constructor...
//Some constructors
double method(double x){ return T*b_ptr->fn(x);}
};
然后按如下方式实现此设置:
int main(){
std::unique_ptr<Derived> ptr(new Derived(5.4));
algo(3.2,ptr);
method(2.4);
return 0;
}
当然,这是一个非常简单的示例,但它可以解决我的问题。据我了解,以这种方式使用派生类意味着该方法是在运行时而不是在编译时选择的。由于我的算法不需要任何动态行为——一切都是在编译时确定的——这是不必要的效率损失。有没有办法在编译时执行上述操作,即静态多态性?
据我了解,只能使用模板获得静态多态性。但是,我无法找到具有非原始类型的实现模板。与上面的示例一样,我需要具有非默认构造函数的派生类,这似乎是不可能的......有人可以提供任何解决方案来解决这个问题吗?
【问题讨论】:
-
您对不必要的动态行为的观察是精明的:如果您必须推迟决定您需要运行时的实际类型,您应该只有多态类层次结构。很好的例子是解析来自网络协议的消息或在事件循环中处理事件。否则,如果你真的知道你需要什么类型,那么虚函数多态不是正确的工具。
-
it's only possible to get static polymorphism using templates多态是基于当前对象类型调用正确的函数。所以我想说函数重载也是静态多态。
标签: c++ templates static-polymorphism