gpt4 book ai didi

类似类的 C++ 类模板

转载 作者:行者123 更新时间:2023-11-27 23:17:32 26 4
gpt4 key购买 nike

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

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

实际类比较复杂,但原理就是这样。现在,我需要从流中解析 float。 Float 与 double 非常相似,因此已经实现了 int。我不能合并此类定义,所有 doubleintfloat 都以某种方式模板化了吗?

这就是我的意思:

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

确保主类模板的非公共(public)成员数据是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...
};

关于类似类的 C++ 类模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15509844/

26 4 0