类似类的c++类模板
C++ class template for similar classes
我有一个套接字数据类型类,用于读取和解析套接字流的值(也可以用于文件)。
设我的class为mc_double
:
class mc_double {
private:
double value;
public:
bool read(socket);
write(double);
}
实际类更复杂,但这是原则。现在,我需要从流中解析float
。Float类似于double,所以已经实现了int
。我不能合并这个类定义,与所有double
, int
和float
以某种方式模板化?
我的意思是:
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_float
和mc_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_double
和mc_int
的名称,那么您可以:
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' */ }
};
- 没有找到相关文章