模板参数:现代C++设计

0s0u357o  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(96)

我读过《现代C++设计》
我在它的示例代码中有一个问题
在p278 p279
如果你没有那本书就去找洛基的线人
MutilMethods.h中的BasicDipatcher::AddBasicDispatcher::Go
在第278页底部至第279页顶部
它有一段示例代码

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)
(If我添加disp.Go....在SAMELE码中),
相反,将抛出std:runtime_error
我说的对吗?
谢了

q9yhzks0

q9yhzks01#

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也是如此。
简而言之:模板中写的类型名<...>只是一个占位符,使用时会被实际类型替换。
希望这对你有帮助。
P.S:关于尖括号内的classtypename,它们有相同的含义,我猜这只是一个hint的读者,BaseLhs和BaseRhs将永远是类。

相关问题