我读过“现代C++设计”
我在它的示例代码中有一个问题
在p278 p279中
如果你没有这本书,也可以参考洛基的资料
MutilMethods.h中的BasicDipatcher::Add和BasicDispatcher::Go
在页面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&,
在这种情况下,哪个应该是矩形&,保利&
所以钥匙不会匹配,因为它们是不同的
因此,回调(HatchRectanglePoly)不会被调用
(如果我加上disp.Go.(在samele代码中),
相反,将抛出一个std:runtime_error
我说得对吗?
谢谢
发布于 2016-09-16 13:07:36
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 (因为我们只提供了一个模板参数)。在这个实例化中,Go方法有点像这样:
void Go(Shape& lhs, Shape& rhs);Add也是如此。
简而言之:用template<...>编写的类型名称只是一个占位符,在使用时它将被实际类型所替代。
希望你觉得这有帮助。
P.S:关于角括号内的class和typename,它们的含义是相同的,我想这对读者来说只是一个hint,BaseLhs和BaseRhs永远是类。
https://stackoverflow.com/questions/8448455
复制相似问题