从模板中的另一个 class 名称派生出一个 class 名称
Derive a class name from another class name in template
为了使用库,我需要使用具有相同基本名称的不同 classes。即
MyClass
MyClassImpl
PreMyClass
等等。为了将它们与模板一起使用,我需要传递所有这些 class 名称。
template <typename T, typename TImpl, typename PreT>
class ClassThatUsesAllTheseObjects
{
public:
ClassThatUsesAllTheseObjects();
private:
T myClass;
TImpl myClassImpl;
PreT myPreClass;
};
仅将主体 MyClass
作为模板参数,在需要时构建其他名称是否可以获得相同的结果?
我不确定你的问题中的设置,但在某些情况下,你可能想做类似 trait mechanism 的设置。
假设你写了一个具体的MyClass
,其他人也喜欢它。对于每组具体的 classes,您可以执行以下操作:
// 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;
};
...
然后你像这样使用特征 class:
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;
};
这让您可以解释您的主要具体 class 的 "natural friends" 是什么。
我能想到两个方案:
- 使用标签来改变。所以你会有例如a
template <class T> myClass
, a 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
模板专业化应该使他们的定义easy/possible。
- 特质,但那边已经有答案了:-)
为了使用库,我需要使用具有相同基本名称的不同 classes。即
MyClass
MyClassImpl
PreMyClass
等等。为了将它们与模板一起使用,我需要传递所有这些 class 名称。
template <typename T, typename TImpl, typename PreT>
class ClassThatUsesAllTheseObjects
{
public:
ClassThatUsesAllTheseObjects();
private:
T myClass;
TImpl myClassImpl;
PreT myPreClass;
};
仅将主体 MyClass
作为模板参数,在需要时构建其他名称是否可以获得相同的结果?
我不确定你的问题中的设置,但在某些情况下,你可能想做类似 trait mechanism 的设置。
假设你写了一个具体的MyClass
,其他人也喜欢它。对于每组具体的 classes,您可以执行以下操作:
// 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;
};
...
然后你像这样使用特征 class:
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;
};
这让您可以解释您的主要具体 class 的 "natural friends" 是什么。
我能想到两个方案:
- 使用标签来改变。所以你会有例如a
template <class T> myClass
, astruct 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
模板专业化应该使他们的定义easy/possible。
- 特质,但那边已经有答案了:-)