Пример кода в современном дизайне C++

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

в p278 p279
или обратитесь к источнику Локи, если у вас нет книги
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.... в тот же код),
и вместо этого будет брошено std:runtime_error

Я прав??

Спасибо

1 ответ

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 всегда будут классами.

Другие вопросы по тегам