我已阅读"现代C ++设计"
我的示例代码中有一个问题
或者如果你没有书,请参考Loki的来源
MutilMethods.h中的 BasicDipatcher ::添加和 BasicDispatcher :: Go
页面p278底部到p279向上
它有一段示例代码
typedef BasicDispatcher<Shape> Dispatcher;
void HatchRectanglePoly(Shape& lhs, Shape& rhs) {...}
Dispatcher disp;
disp.Add<Rectangle, Poly>(HatchRectanglePoly);
我在函数Go中找到了它的参数是BaseLhs&amp;,BaseRhs&amp;
在这种情况下,应该是 Shape&amp;,Shape&amp;
并且在函数Add中,它的参数是SomeLhs&amp;,SomeLhs&amp;,
在这种情况下,应该是矩形&amp;,Poly&amp;
因此,无论如何,密钥都不会匹配,因为它们是不同的
因此回调(HatchRectanglePoly)不会被称为
(如果我在同一代码中添加disp.Go ....),
而是,
std:runtime_error将被抛出
我是对的吗?
感谢
答案 0 :(得分:0)
BaseLhs和BaseRhs是模板参数。就像函数参数一样,当您使用(实例化模板)时,将提供实际值,而不是在您定义它时。
template
<
class BaseLhs,
class BaseRhs = BaseLhs,
typename ResultType = void,
typename CallbackType = ResultType (*)(BaseLhs&, BaseRhs&)
>
class BasicDispatcher
默认情况下,BaseRhs与BaseLhs相同。
typedef BasicDispatcher<Shape> Dispatcher;
Dispatcher disp;
这里,我们实例化一个BasicDispatcher的版本,BaseLhs是Shape,BaseRhs也是Shape(因为我们只提供1个模板参数)。在这个实例化中,Go
方法有点像这样:
void Go(Shape& lhs, Shape& rhs);
Add
同样如此。
简而言之:用模板&lt; ...&gt;写的类型名称它只是一个占位符,在使用时将被实际类型替换。
希望您觉得这很有帮助。
PS:关于尖括号内的class
和typename
,它们具有相同的含义,我猜它只是hint给读者的BaseLhs和BaseRhs将永远是班级。