从模板中的另一个类名派生类名
Derive a class name from another class name in template
为了使用库,我需要使用具有相同基本名称的不同类。
即MyClass
MyClassImpl
PreMyClass
为了将它们与模板一起使用,我需要传递所有这些类名。
template <typename T, typename TImpl, typename PreT>
class ClassThatUsesAllTheseObjects
{
public:
ClassThatUsesAllTheseObjects();
private:
T myClass;
TImpl myClassImpl;
PreT myPreClass;
};
是否可能获得相同的结果,仅给出主要MyClass
作为模板参数,在需要时构建其他名称?
我不确定问题中的设置,但在某些情况下,您可能想做一些类似特质机制的事情。
假设你写了一个具体的MyClass
,还有其他类似的。对于每组具体类,您可以执行以下操作:
// This is common
template <typename T>
struct foo_traits
{
};
// This is for each set of concrete classes
template<>
struct foo_traits<MyClass>
{
using Impl = MyClassImpl;
using Pre = PreMyClass;
};
...
然后像这样使用 traits 类:
template <
typename T,
class Impl = typename foo_traits<T>::Impl,
class Pre = typename foo_traits<T>::Pre>
class ClassThatUsesAllTheseObjects
{
public:
ClassThatUsesAllTheseObjects();
private:
T myClass;
Impl myClassImpl;
Pre myPreClass;
};
这使您可以解释主要具体类的"自然朋友"是什么。
我可以想到两个选项:
- 使用标记来区分。所以你会有例如一个
template <class T> myClass
,一个struct impl_t{}, struct pre_t{}, struct base_t{}
,然后以这种方式使用gthem:
法典:
myClass<base_t> ; // instead of plain MyClass
myClass<impl_t> ;// instead of plain MyClassImpl
myClass<pre_t> ; // instead of myPreClass
模板专用化应该使它们的定义变得容易/可能。
- 特征,但那边已经有一个答案:-)
相关文章:
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 两个抽象类,派生自同一个基类.如何访问从一个抽象类到另一个抽象类的指针
- C++多态性:如何测试一个类是否派生自另一个基类
- 派生类不能用另一个基类的成员重载基类中的私有成员
- 通过 c++ 中的 udp 套接字将派生类对象从一个进程发送到另一个进程
- 是否可以在引用另一个派生类的派生类中声明复制构造函数?
- 无法从派生类型的作用域访问另一个实例的受保护成员
- 如何在另一个类的向量中调用派生类的析构函数
- 从具有相同基数的另一个派生类调用派生类的非 const 方法
- 从另一个类模板类型推导派生的类模板
- 如何从另一个类的基类访问派生类中的受保护成员
- 从基类(车辆)继承方法,从派生类(汽车)继承值,以使用 C++ 在另一个派生类(车道)中实现
- 用于确定一个类是否派生自另一个类的代码说明
- 如何使用派生类中的虚拟函数,该函数在另一个具有基类参数的类中声明
- 如何禁止派生类从基C++派生,但允许从另一个派生类派生
- 一个可以将参数化的类作为参数传递给另一个将由另一个派生的类吗
- 如何创建从另一个派生的两个ATL接口
- 如何正确删除从另一个DLL接收的派生对象
- 是否可以使用相同的基类从另一个派生对象访问派生对象