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