Пример кода в современном дизайне 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 всегда будут классами.