0

テンプレートパラメータに基づいてメンバー変数を含める/除外することはC++で可能ですか?

次に例を示します。

template< class T >
class RealNumber
{
    T real;
};

template< class T >
class ComplexNumber
{
    T real;
    T imag;
};

これらには多くの共通プロパティがあるため、数値を表すクラスを 1 つだけ持つ (追加のテンプレート パラメーターを使用) ことで、コードの重複を防ぐことができます。

私がやりたかったことは次のようなものです

template< class T , class U >
Number
{
    T real;

    // If U is not void
    U imag;
}

したがって、2 番目のパラメーターが void の場合、imag という名前のメンバーは存在せず、次のようになります。

sizeof( Number< T , void > ) == sizeof( T )

enable_if を試しましたが、結果が得られませんでした。

これが不可能な場合、これを可能にするハックはありますか?

4

4 に答える 4

1
typedef NullType struct {} NullType;
template< class T , class U = NullType>
class Number
{
  T real;
  U image;
}
于 2011-11-14T04:12:45.713 に答える
1

継承のトリックが実行可能かどうかを確認します。

template<class T, class = void >
class RealNumber
{
  protected: T real;
};

template<class T, class U>
class ComplexNumber : public RealNumber<T>
{
  U imag;
};
于 2011-11-14T04:30:55.063 に答える
1

enable_ifこの回答は不完全であり、クラス テンプレートの特殊化に使用する方法のみを示しています。

template<class T,class U,class Enable = void>
class Number
{
  T real;
  T imag;
};
template<class T,class U>
class Number<T,U,typename std::enable_if<std::is_void<U>::value>::type>
{
  T real;
};

詳細な実装は、問題の正確な性質によって異なります。そのような、

  • RealNumber から ComplexNumber への変換 (つまりis_a関係) が許可されている場合、ある実装から別の実装への継承を検討できます。
  • 多数のプロパティを再利用するために、共通部分をプライベート基本クラスに実装できます。
  • 正確な問題に応じて、テンプレート パラメータUが本当に必要かどうかを確認できます。また、実数Number<int,void>または単にの優先構文は何ですかNumber<int>。等
于 2011-11-14T07:14:02.610 に答える
0

どこで運転しているのかを言うのは非常に難しいですが、ここに大まかなスケルトンがあります:

template <typename T> class Number
{
  template <typename S> class Adder
  {
    typedef S type;
    static type add(type a, type b) { return a + b; }
  };
  template <typename U, typename W> class Adder<std::pair<U,W>>
  {
    typedef typename std::pair<U,W> type;
    static type add(type a, type b) { return type(a.first + b.first, a.second + b.second); }
  };

  T val;

public:
  T operator+(const T rhs) { return Adder<T>::add(val, rhs); }
};

ほとんどの標準ライブラリの数値関数はすでにstd::complex型に対してオーバーロードされているため、これを本当に自分で作成する必要があるかどうかについて少し考えてみてください。

使用法:Number<int>、、Number<double>Number<std::pair<double, double>>

于 2011-11-14T04:20:28.780 に答える