从模板中的另一个类名派生一个类名
Posted
技术标签:
【中文标题】从模板中的另一个类名派生一个类名【英文标题】:Derive a class name from another class name in template 【发布时间】:2015-08-25 10:23:41 【问题描述】:为了使用库,我需要使用具有相同基名的不同类。即
MyClass
MyClassImpl
PreMyClass
等等。为了将它们与模板一起使用,我需要传递所有这些类名。
template <typename T, typename TImpl, typename PreT>
class ClassThatUsesAllTheseObjects
public:
ClassThatUsesAllTheseObjects();
private:
T myClass;
TImpl myClassImpl;
PreT myPreClass;
;
如果只给出主体MyClass
作为模板参数,在需要时构建其他名称,是否可以获得相同的结果?
【问题讨论】:
预处理器用于此。 【参考方案1】:我不确定您的问题中的设置,但在某些情况下,您可能想要执行类似 trait mechanism 的操作。
假设你写了一个具体的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;
;
...
然后你像这样使用特征类:
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;
;
这使您可以解释您的主要具体类的“天然朋友”是什么。
【讨论】:
谢谢,这正是我所需要的。【参考方案2】:我能想到两个选择:
-
使用标签来做出改变。所以你会有例如一个
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
模板专业化应该使它们的定义变得容易/可能。
-
特质,但那边已经有答案了:-)
【讨论】:
标签是一个不错的解决方案,但我更喜欢特质,因为我无法修改这些类。但这也是个好主意。以上是关于从模板中的另一个类名派生一个类名的主要内容,如果未能解决你的问题,请参考以下文章