Выведение аргумента шаблона c ++ из другого аргумента - PullRequest
0 голосов
/ 04 августа 2020

Я использую шаблон 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 со стороны пользователя.

Есть ли способ привязать второй аргумент к первому аргументу? т. е. второй аргумент не участвует в выводе аргумента, он определяется некоторым отношением отображения, которое я определил.

1 Ответ

1 голос
/ 04 августа 2020

Вы имеете в виду следующее?

template <typename T, typename TImpl = typename T::impl>
std::shared_ptr<const T> GetObjectById(int id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...