首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >现代C++设计中的样本代码

现代C++设计中的样本代码
EN

Stack Overflow用户
提问于 2011-12-09 16:20:50
回答 1查看 435关注 0票数 0

我读过“现代C++设计”

我在它的示例代码中有一个问题

在p278 p279中

如果你没有这本书,也可以参考洛基的资料

MutilMethods.h中的BasicDipatcher::AddBasicDispatcher::Go

在页面p278底部到p279向上

它有一段示例代码

代码语言:javascript
复制
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

我说得对吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2016-09-16 13:07:36

BaseLhs和BaseRhs是模板参数。就像函数参数一样,实际值将在使用它(实例化模板)时提供,而不是在定义它时提供。

代码语言:javascript
复制
template
<
  class BaseLhs,
  class BaseRhs = BaseLhs,
  typename ResultType = void,
  typename CallbackType = ResultType (*)(BaseLhs&, BaseRhs&)
>
class BasicDispatcher

默认情况下,BaseRhs与BaseLhs相同。

代码语言:javascript
复制
typedef BasicDispatcher<Shape> Dispatcher;
Dispatcher disp;

这里,我们实例化了BasicDispatcher的一个版本,BaseLhs是Shape,BaseRhs也是Shape (因为我们只提供了一个模板参数)。在这个实例化中,Go方法有点像这样:

代码语言:javascript
复制
void Go(Shape& lhs, Shape& rhs);

Add也是如此。

简而言之:用template<...>编写的类型名称只是一个占位符,在使用时它将被实际类型所替代。

希望你觉得这有帮助。

P.S:关于角括号内的classtypename,它们的含义是相同的,我想这对读者来说只是一个hint,BaseLhs和BaseRhs永远是类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8448455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档