gpt4 book ai didi

c++ - 如何使用模板类保持代码整洁?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:52:27 26 4
gpt4 key购买 nike

我有一个这样的模板类:

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

但是有更好的方法吗?

最佳答案

我的第一个想法是推荐 Class1 从抽象基类继承,然后构造 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 上的单个模板参数......请参阅我的第一句话。)

关于c++ - 如何使用模板类保持代码整洁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26085606/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com