我有一个这样的模板类:
template <class TType> class Class1;
这个类在许多其他类中使用:
class Class2 {
Class1 _class1; // How to pass the template parameter of Class1 in a clean way ?
};
// Same for Class3, Class4, ...
问题是Class1的模板参数必须由客户端代码选择,所以我不能像这样直接放置它:
class Class2 {
Class1<OneType> _class1; // Not correct, template parameter must be chosen by client code
};
所以正确的方法是将Class2也设置为模板类:
template <class TTypeClass1> class Class2 {
Class1<TTypeClass1> _class1;
};
这个技术的问题是所有使用Class1的类都必须是模板类,所以我们污染其他类的代码来传递Class1的模板参数,如果这些类由许多带有很多模板的模板类组成,那就更糟了参数。
我发现另一种方式,我认为它更清洁:
template <class TTypeClass1 /* And possible other parameters */> struct ClientConfiguration {
// Declaration of EntityManager
typedef Class1<TTypeClass1> Class1Typed;
};
// Configuration defined by client code
typedef ClientConfiguration<OneTypeForClass1 /* And possible other parameters */> CurrentClientConfiguration;
class Class2 {
CurrentClientConfiguration::Class1Typed _class1;
}
但有更好的方法吗?
答案 0 :(得分:0)
我的第一个想法是建议Class1
从Abstract Base Class继承并构建Class2
(等),例如,使用工厂来制作Class1
你的味道(或客户)希望。
然而,我认为在这个特定问题中你似乎更好的指导可能是使用特征?
struct TTrait_int {
typedef int TClass1;
};
struct TTrait_float {
typedef float TClass1;
};
template <class TRAITS>
class Class2 {
Class1<typename TRAITS::TClass1> _class1;
};
...
Class2<TTrait_int> c2tta;
Class2<TTrait_float> c2ttb;
要明确的是,这可以在简单的1模板参数案例中为您提供无真正的好处。
但它确实很好地扩展非常 ......
您只需要一个Class2
模板参数 - 特征类:而不是不断增长的Class2
模板参数列表,您需要增加此特征类必须提供的“名称”套件。
(如果您想在Class2
上丢失单个模板参数...请参阅我的第一句话。)