Modern C ++ Design中的示例代码

时间:2011-12-09 16:20:50

标签: c++ loki

我已阅读"现代C ++设计"
我的示例代码中有一个问题

p278 p279中的


或者如果你没有书,请参考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将被抛出

我是对的吗?

感谢

1 个答案:

答案 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:关于尖括号内的classtypename,它们具有相同的含义,我猜它只是hint给读者的BaseLhs和BaseRhs将永远是班级。