创建依赖于另一个模板的类模板

Making a class template that is dependent on another template

提问人:Chris Gnam 提问时间:5/4/2023 最后编辑:Chris Gnam 更新时间:5/4/2023 访问量:51

问:

所以我有一组类,它们都是从基类派生的(注意:在下面的代码中用于指定精度类型(例如),而 ued 用于指定颜色类型(例如):RigidBodyTpfloatTcRGB

template <typename Tp>
class RigidBody {
    ...
}

这些类是 、 、 等。下面是一个示例ModelAssemblyLightModel

template <typename Tp, typename Tc>
class Model : public RigidBody<Tp> {
    ...
}

我现在需要编写一个模板化类,该类充当所有这些类的包装器,并且也派生自 .我目前拥有的是:InstanceRigidBody

template <typename Tp, typename ObjectType>
class Instance : public RigidBody<Tp> {
    ...
};

虽然这可行,但需要专门使用(例如)感觉很笨拙

Instance<float, Model<float,RGB>>

因为是多余的。我宁愿能够使用floatInstance<Model<float,RGB>>

我已经阅读了有关“模板模板”语法的信息,但这似乎并不能解决我的问题。我试过:

template <template<typename Tp,typename Tc> typename ObjectType>
class Instance : public RigidBody<Tp> {
    ...
}

但这不起作用,因为它是类声明的实际主体的未声明标识符。Tp

有没有办法得到我想要的行为?在任何情况下,我都不希望允许实例具有与它所包装的任何对象不同的精度。

C++ 模板 继承 Template-specialization 派生类

评论

1赞 HolyBlackCat 5/4/2023
只?并为 to 添加一个成员 typedef(假设你犯了一个错别字并且它是一个公共基),这样你就可以从 .template <typename T> class InstanceTpRigidBodyTpT
0赞 Chris Gnam 5/4/2023
你是对的,这是一个错别字(我修复了它)。但是,我并不完全理解您的意思。如何从中提取?TpT

答:

2赞 HolyBlackCat 5/4/2023 #1

让接受只是 .class Instance<typename ObjectType>

添加到(它必须是公共的或受保护的)。using foo = Tp;class RigidBody

然后,您可以使用 in 来访问该类型:typename ObjectType::fooInstance

template <typename Tp>
class RigidBody
{
  public:
    using foo = Tp;
};

template <typename Tp>
class A : public RigidBody<Tp> {};

template <typename ObjectType>
class Instance : public RigidBody<typename ObjectType::foo> {};

评论

0赞 Chris Gnam 5/5/2023
再次感谢你。一如既往的非常有启发性的例子!