虽然它们的核心动态绑定和模板是根本不同的东西,但它们可以用于实现相同的功能。
代码示例(仅供参考)
a) 动态绑定
namespace DB {
// interface
class CustomCode {
public:
virtual void operator()(char) const = 0;
};
class Lib {
public:
void feature(CustomCode const& c) {
c('d');
}
};
// user code
class MyCode1 : public CustomCode {
public:
void operator()(char i) const {
std::cout << "1: " << i << std::endl;
}
};
class MyCode2 : public CustomCode {
public:
void operator()(char i) const {
std::cout << "2: " << i << std::endl;
}
};
void use() {
Lib lib;
lib.feature(MyCode1());
lib.feature(MyCode2());
}
}
B) 泛型编程
namespace GP {
//interface
template <typename CustomCode> class Lib {
public:
void feature(CustomCode const& c) {
c('g');
}
};
// user code
class MyCode1 {
public:
void operator()(char i) const {
std::cout << "1: " << i << std::endl;
}
};
class MyCode2 {
public:
void operator()(char i) const {
std::cout << "2: " << i << std::endl;
}
};
void use() {
Lib<MyCode1> lib;
lib.feature(MyCode1());
//lib.feature(MyCode2()); <-- illegal
}
}
问题
一些想法
虽然这些范例并不完全相同,并且各有优缺点(A
功能更强大(参见 参考资料MyCode2
)并且B
对用户来说更灵活),但它们都允许实现相同的功能(尽管上面暗示的限制适用)。
无论如何,由于虚函数的间接性,理论上(TM)A
在运行时会慢一些,同时B
提供一些很好的优化机会,因为可以内联方法(当然你没有间接性)。
然而,我经常觉得这A
有点自我记录,因为你有一个清晰的接口,你必须实现(通常包含多个方法),同时B
有点无政府主义(这意味着它的灵活性)。
核
- 是否有这些范式的一般结果/比较研究?
- 提速是否显着?
- 编译时间呢?
A
对于大型系统中的接口(我主要用于模块间接口,到目前为止我还没有做过真正的大项目),这两种接口的设计含义是什么?
编辑
注意:说“动态绑定更好,因为它更强大”根本不是一个答案,因为前提是你有一个两种方法都适用的情况(否则没有选择的自由——至少不合理) .