0

我已阅读“现代 C++ 设计”
,我在其示例代码中有一个问题

在 p278 p279 中
,如果您没有 MutilMethods.h 中的 BasicDipatcher::Add 和 BasicDispatcher::Go 这本书,请参考Loki
代码

在 p278 页底部到 p279 向上
它有一段示例代码

typedef BasicDispatcher<Shape> Dispatcher;
void HatchRectanglePoly(Shape& lhs, Shape& rhs) {...}
Dispatcher disp;
disp.Add<Rectangle, Poly>(HatchRectanglePoly);

我在函数 Go 中发现,它的参数是 BaseLhs&,BaseRhs&
在这种情况下,应该是Shape&,Shape&

在函数 Add 中,它的参数是 SomeLhs&,SomeLhs&,
在这种情况下,应该是Rectangle&,Poly&

所以密钥无论如何都不匹配,因为它们是不同的

因此不会调用回调(HatchRectanglePoly)
(如果我在相同的代码中添加 disp.Go....),
而是会抛出 std:runtime_error

我对么??

谢谢

4

1 回答 1

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

简而言之:template<...> 中写的类型名称只是一个占位符,使用时会被实际类型替换。

希望你觉得这很有帮助。

PS:关于尖括号里面的classand typename,它们的含义是一样的,我想这只是给读者一个提示,BaseLhs 和 BaseRhs 将永远是类。

于 2016-09-16T13:07:36.087 回答