如何使用模板类保持代码清洁?

时间:2014-09-28 13:57:36

标签: c++ class templates c++11

我有一个这样的模板类:

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;
}

但有更好的方法吗?

1 个答案:

答案 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上丢失单个模板参数...请参阅我的第一句话。)