当行为可能不同时,模板如何复制动态多态?

时间:2013-11-20 14:47:10

标签: c++ oop templates polymorphism

我听说模板可以用来通过静态多态复制动态多态。如果是这种情况,我很困惑它是如何工作的。

我认为模板的目的是复制完全相同的行为,但跨越不同的类。在契约中,动态多态允许您为不同的类调用完全相同的API(在函数中可以有不同的行为)?如果对象之间存在不同的行为,模板如何实现这个?

2 个答案:

答案 0 :(得分:3)

以下是一个例子:

template <typename T>
class logger
{
  public:

  void log(const std::string& str)
  {
    this->_interface.kindof_virtual_method_without_runtime_cost(str);
  }

  private:

  T _interface;
};

class on_console{...};
class on_network{...};

int main(void)
{
  logger<on_console> logger_console;
  logger<on_network> logger_network;

  logger_console.log("debug");
  logger_network.log("release");

  return 0;
}

  

我认为模板的目的是复制完全相同的行为,但跨越不同的类。在契约中,动态多态性允许您为不同的类调用完全相同的API(在函数中可以具有不同的行为

正如您在上面的示例中所看到的,它是一个模板,允许您调用完全相同的API(“kindof_virtual_method_without_runtime_cost”成员函数),它可以为不同的类具有不同的行为

这可能是

的含义
  

通过静态多态复制动态多态

当然这不适用于依赖于运行时条件(用户输入等)的情况,必须在编译时知道多态分支

答案 1 :(得分:0)

您正在寻找的是CTRP c ++习惯用法的特殊用法,在某些情况下,它可以取代静态动态多态性。 见http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern#Static_polymorphism