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

結果は、 、 、の3 つのクラスになるはずです。 公式の C++ テンプレート ドキュメントを見つけましたが、質問の最後の部分しかわかりませんでした。複数のデータ型を受け入れる関数を作成できます。残りはそれほど簡単ではないようです。mc_intmc_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_double本当にとの名前を使用したい場合は、次のmc_intいずれかを実行できます。

a) それらの型エイリアスを作成します。

typedef mc<double> mc_double;
typedef mc<int> mc_int;

b) 特殊化を使用せず、1 つのテンプレート パラメータを持つようにクラス テンプレートの設計を変更し、派生クラスを個別に作成します。

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 の型に基づいて一部のメソッドを簡単に特殊化することはできません (つまり、1 つのメソッドだけでなく、クラス全体を特殊化する必要があります)。これは、型に関係なく同じメソッドがベースにあり、特殊化が派生クラスにある、ある種の継承階層で解決できます。writeしたがって、上記を保持して(変更されないものと仮定して)、次を作成します。

class mc_double : public mc<double>
{
public:
    void doSomethingSpecific() { /* code specific for 'doubles' */ }
};
于 2013-03-19T20:37:53.383 に答える