c ++模板参数从另一个参数推导

c++ template argument deduction from another argument

我在我的代码中使用了 pimpl 模式,所以对于每个 class X,都会有一个相应的实现 class XImpl

假设我们有 AAImplBBImplCCImpl,其中 A ,B,C类似class,我想为他们写一些模板函数

template <typename T, typename TImpl>
std::shared_ptr<const T> GetObjectById(int id);

此功能是通过对象的id查询对象(类型可以是ABC)。在函数定义中,我确实需要同时使用 TTImpl.

用户会这样使用这个功能:

auto a = GetObjectById<A, AImpl>(1);
auto b = GetObjectById<B, BImpl>(2);
auto c = GetObjectById<C, CImpl>(3);

如您所见,对于每种类型 TTImpl 始终绑定到它。所以我想把它的用法简化为

auto a = GetObjectById<A>(1);
auto b = GetObjectById<B>(2);
auto c = GetObjectById<C>(3);

更重要的是,这可以从用户端隐藏AImpl

是否可以将第二个参数绑定到第一个参数?即第二个参数不参与参数推导,它是由我定义的某种映射关系指定的。

你的意思如下?

template <typename T, typename TImpl = typename T::impl>
std::shared_ptr<const T> GetObjectById(int id);