Я использую шаблон pimpl в своем коде, поэтому для каждого класса X
будет соответствующий класс impl XImpl
Скажем, у нас есть A
, AImpl
, B
, BImpl
, C
, CImpl
, где A
, B
, C
- аналогичные классы, и я хотел бы написать для них некоторую шаблонную функцию.
template <typename T, typename TImpl>
std::shared_ptr<const T> GetObjectById(int id);
Эта функция предназначена для запроса объекта по его идентификатору (тип может быть A
, B
или C
). В определении функции мне нужно использовать как T
, так и TImpl
.
Пользователи будут использовать эту функцию следующим образом:
auto a = GetObjectById<A, AImpl>(1);
auto b = GetObjectById<B, BImpl>(2);
auto c = GetObjectById<C, CImpl>(3);
И, как видите, для каждый тип T
, TImpl
всегда привязан к нему. Поэтому я хочу упростить его использование до
auto a = GetObjectById<A>(1);
auto b = GetObjectById<B>(2);
auto c = GetObjectById<C>(3);
Что еще более важно, это может скрыть AImpl
со стороны пользователя.
Есть ли способ привязать второй аргумент к первому аргументу? т. е. второй аргумент не участвует в выводе аргумента, он определяется некоторым отношением отображения, которое я определил.