类似类的c++类模板

C++ class template for similar classes

本文关键字:c++      更新时间:2023-10-16

我有一个套接字数据类型类,用于读取和解析套接字流的值(也可以用于文件)。
设我的class为mc_double:

class mc_double {
    private:
           double value;
    public:
           bool read(socket);
           write(double);
}

实际类更复杂,但这是原则。现在,我需要从流中解析float。Float类似于double,所以已经实现了int。我不能合并这个类定义,与所有double, intfloat以某种方式模板化?

我的意思是:

 class mc_<typename = double or int or float> {
    private:
           typename value;
    public:
           bool read(socket);
           write(typename);
}     

一些方法将单独定义为mc_double::method(),其他方法将对所有类型相同:mc_typename::general_method()。此外,对于一些我只需要在代码中进行微小的更改:

typename mc_typename::return_value() {
         return val;
}
或者构造函数:
mc_typename::mc_typename(<int, long, char, double> number) {
        val = (typename)number;
}

结果应该是三个类- mc_int, mc_floatmc_double
我找到了官方的c++模板文档,但我只找到了问题的最后一部分——我可以创建一个接受多种数据类型的函数。剩下的就没那么容易了。

你可以让你的类成为一个类模板:

template<typename T, bool base = true>
class mc {
protected:
   T value;
public:
   bool read(socket);
   write(T);
};

这个类将包含所有类型T的通用成员函数。然后,您可以为不同的类型分别专门化这个类模板,让它们从mc<T, true>继承:

template<>
class mc<double, true> : public mc<double, false> {
public:
    // Member functions for double only...
};
template<>
class mc<int, true> : public mc<int, false> {
public:
    // Member functions for int only...
};

如果您希望派生类访问主类模板的非公共成员数据,请确保它们为protected

你可以这样实例化它们:

mc<double> m;
mc<int> m;
// ...

如果您真的想使用mc_doublemc_int的名称,那么您可以:

a)为它们创建类型别名:
typedef mc<double> mc_double;
typedef mc<int> mc_int;

b)改变类模板的设计,不使用特化,只有一个模板参数,并独立创建派生类:

template<typename T>
class mc {
protected:
   T value;
public:
   bool read(socket);
   write(T);
};
class mc_double : public mc<double> {
public:
    // Member functions for double only...
};
class mc_int: public mc<int> {
public:
    // Member functions for int only...
};

您可以在类定义中使用模板,如下所示:

template <typename T>
class mc
{
public:
   bool write(T _val);
private:
   T mVal;
};

,但是你不能很容易地专门化一些方法,而不是基于T的类型专门化其他方法(即,你必须专门化整个类,而不仅仅是一个方法)。您可以使用某种继承层次结构来解决这个问题,其中,无论类型如何,方法都是相同的,而专门化则在派生类中。所以保持上面的(假设write是一个不改变的)并创建:

class mc_double : public mc<double>
{
public:
    void doSomethingSpecific() { /* code specific for 'doubles' */ }
};
相关文章:
  • 没有找到相关文章