0

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

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

实际的类比较复杂,但这是原理。现在,我需要float从流中解析。Float 与 double 类似,因此已经实现int。我不能将这个类定义与 all和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和。 我找到了官方的 C++ 模板文档,但我只弄清楚了问题的最后一部分——我可以创建一个接受多种数据类型的函数。其余的似乎并不那么容易。mc_floatmc_double

4

2 回答 2

3

你可以让你的班级成为班级模板:

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_doubleandmc_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...
};
于 2013-03-19T20:37:34.490 回答
1

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

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' */ }
};
于 2013-03-19T20:37:53.383 回答