4

私は、恐ろしくネストされ、特殊化されすぎたテンプレート化された C++ コードを削減して単純化しようとしています。そのために、関数またはクラスがインスタンス化されたテンプレート化された型に依存するメンバー型を宣言できるようにしたいと考えています。

次のジェネリック クラス テンプレートを、テンプレートの特殊化の結果とします。'a' のタイプは、インスタンス化のタイプによって異なります。

  template <typename Float> class A;

  template <>
    class A<double> {  
      double a;
    }
  };

  template <>
    class A<float> {  
      float a;
    }
  };


  template <>
    class A<short> {  
      float a;
    }
  };

これらのクラスは、「a」の型、テンプレート型から型へのマッピングが double->double、float->float、および short->float であることを除いて同一です。このマッピングを単純にカプセル化して、クラスを 1 回だけ記述できるようにする方法はありますか?

次のようなものを書きたいと思いますが、これが可能かどうかはわかりません。

  typedef double Float2<double>;
  typedef float Float2<float>;
  typedef float Float2<short>;

  template <typename Float>
    class A {  
      Float2<Float> a;
    }
  };

注: 私は C++03 を使用しており、この目的で C++11 を使用することはできません (ここでは decltype が役立つ可能性があると思いますが、よくわかりません)。

4

1 に答える 1

8

を使用する必要はありませんdecltype。型特性を作成し、それを特殊化して適切な型マッピングを提供するだけです。

template<typename>
struct mapper;

template<>
struct mapper<double> {
    typedef double type;
};

template<>
struct mapper<float> {
    typedef float type;
};

template<>
struct mapper<short> {
    typedef float type;
};

template <typename Float> 
class A {
    typedef typename mapper<Float>::type float_type;

    float_type a;
};
于 2013-05-17T23:12:56.503 に答える