пример кода в современном дизайне C ++ - PullRequest
0 голосов
/ 09 декабря 2011

Я прочитал «Современный дизайн C ++»
, и у меня есть вопрос в его примере кода

в p278 p279
или обратитесь к источнику Локи, если у вас нетbook
BasicDipatcher :: Add и BasicDispatcher :: Go в MutilMethods.h

на странице 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 .... в тот же код), * ​​1030 * и вместо этого будет выдано std: runtime_error

Я прав?

спасибо

1 Ответ

0 голосов
/ 16 сентября 2016

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.

Вкратце: имя типа, записанное в шаблоне <...>, является просто заполнителем, оно будет заменено реальным типом при использовании.

Надеюсь, вы найдете это полезным.

PS: О class и typename внутри угловой скобки, они имеют одинаковое значение, я думаю, это всего лишь подсказка для читателя, что BaseLhs и BaseRhs всегда будут классами.

...