4

2 つの値を取り、それらに対して何らかの計算を行い、同じ型の値を返すテンプレート化された数学関数があります。

template <typename T>
T math_function(T a, T b) {
  LongT x = MATH_OP1(a,b);
  return MATH_OP2(x,a);
}

基本的に T の長いバージョン (上記では LongT と呼ばれます) である型に中間値 (x 内) を格納したいと考えています。したがって、T が float の場合、x を double にする必要があります。T が int の場合、x を long int にする必要があります。

これを達成する方法はありますか?を試してみenable_ifましたが、本当に必要なようenable_if_elseです。

LongT に何を使用するかをコンパイラに独自に判断してもらいたいと思います。関数を呼び出すときに指定する必要はありません。

4

5 に答える 5

5

必要な型を生成する型マッピングを定義できます。

template <typename T> struct long_type;
template <> struct long_type<int> {
   typedef long type;
};
template <> struct long_type<float> {
   typedef double type;
};

そして、そのメタ関数を使用します。

template <typename T>
T math_function(T a, T b) {
  typename long_type<T>::type x = MATH_OP1(a,b);
  return static_cast<T>(MATH_OP2(x,a));
}

long_typeこの特定の実装では、テンプレートは、特性を提供した型以外の型のコンパイルに失敗します。それ自体にマップするだけの汎用バージョンを提供することをお勧めします。これにより、入力がlong long int使用される場合に使用されます (アーキテクチャに大きな型がないことを前提としています)。

于 2012-08-08T21:56:24.743 に答える
5

T=longたとえば、処理する必要がないと仮定すると、 intandのトレイトを作成するだけですfloat:

template <typename T>
struct LongT;

template <>
struct LongT<int>
{
    typedef long value_type;
};

template <>
struct LongT<float>
{
    typedef double value_type;
};

template <typename T>
T math_function(T a, T b) {
  typename LongT<T>::value_type x = MATH_OP1(a,b);
  return MATH_OP2(x,a);
}
于 2012-08-08T21:56:34.507 に答える
3

C++11 では、autoキーワードを使用して の型を取得できますMATH_OP。安全で、コンパイラによって処理されます。

auto x = MATH_OP1(a,b);
于 2012-08-08T22:13:46.397 に答える
1
template<typename T> struct LongT  {typedef T type;}

template<> struct LongT<int8_t>    {typedef int16_t type;}
template<> struct LongT<int16_t>   {typedef int32_t type;}
template<> struct LongT<int32_t>   {typedef int64_t type;}
template<> struct LongT<int64_t>   {typedef intmax_t type;}
// same for unsigned ...

template<> struct LongT<float>     {typedef double type;}
// template<> struct LongT<double> {typedef long double type;}

次のように使用します。

typename LongT<T>::type  x;
于 2012-08-09T12:55:42.053 に答える