c ++模板参数从另一个参数推导
c++ template argument deduction from another argument
我在我的代码中使用了 pimpl 模式,所以对于每个 class X
,都会有一个相应的实现 class XImpl
假设我们有 A
、AImpl
、B
、BImpl
、C
、CImpl
,其中 A
,B
,C
类似class,我想为他们写一些模板函数
template <typename T, typename TImpl>
std::shared_ptr<const T> GetObjectById(int id);
此功能是通过对象的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
。
是否可以将第二个参数绑定到第一个参数?即第二个参数不参与参数推导,它是由我定义的某种映射关系指定的。
你的意思如下?
template <typename T, typename TImpl = typename T::impl>
std::shared_ptr<const T> GetObjectById(int id);
我在我的代码中使用了 pimpl 模式,所以对于每个 class X
,都会有一个相应的实现 class XImpl
假设我们有 A
、AImpl
、B
、BImpl
、C
、CImpl
,其中 A
,B
,C
类似class,我想为他们写一些模板函数
template <typename T, typename TImpl>
std::shared_ptr<const T> GetObjectById(int id);
此功能是通过对象的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
。
是否可以将第二个参数绑定到第一个参数?即第二个参数不参与参数推导,它是由我定义的某种映射关系指定的。
你的意思如下?
template <typename T, typename TImpl = typename T::impl>
std::shared_ptr<const T> GetObjectById(int id);