我听说模板可以用来通过静态多态复制动态多态。如果是这种情况,我很困惑它是如何工作的。
我认为模板的目的是复制完全相同的行为,但跨越不同的类。在契约中,动态多态允许您为不同的类调用完全相同的API(在函数中可以有不同的行为)?如果对象之间存在不同的行为,模板如何实现这个?
答案 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