7

これはコンパイルされないため、すでに実装されていますか: (gcc 4.7.2 を使用)

template <typename... Ts>
struct Foo {
    int foo() {
        return 0;
    }
};

template <>
struct Foo<int x, int y> {
    int foo() {
        return x * y;
    }
};

int main()
{
    Foo<2, 3> x;
    cout << x.foo() << endl; //should print 6
}
4

1 に答える 1

11

あなたはいくつかの間違いを犯しています。プライマリ テンプレートは、整数定数ではなく、型を想定しています。また、整数定数を使用してテンプレートをインスタンス化しようとしますが、部分的な特殊化では型が使用されます。

これはより近いです:

#include <iostream>

template <int... Ts>
struct Foo {
    int foo() {
        return 0;
    }
};

template <>
struct Foo<3, 2> {
  const int x = 3;
  const int y = 2;

  int foo() {
    return x * y;
  }
};

int main()
{
    Foo<2, 3> x;
    std::cout << x.foo() << std::endl; //should print 6
}

しかし、これは私たちが本当に望んでいるものではありませんよね? そして不器用でもあります。

#include <iostream>

template<typename Acc, typename... Rest>
struct accum_help; // primary

template<typename Acc, typename F, typename... Rest>
struct accum_help<Acc, F, Rest...> {
  typedef typename accum_help<
    std::integral_constant<typename Acc::value_type, 
                           Acc::value * F::value>, Rest...
    >::type type;
};

template<typename Acc>
struct accum_help<Acc> {
  typedef Acc type;
};

// peek into the first argument to avoid summing empty sequences and
// get the right type
template<typename X, typename... Integrals>
struct accum {
  typedef typename accum_help<
    std::integral_constant<typename X::value_type, 1>, X, Integrals...
    >::type type;
};

int main()
{

  std::cout << accum< std::integral_constant<int, 2>, std::integral_constant<int, 3> >::type::value << std::endl; //should print 6
}

int のみを処理するより単純なバリアント:

template <int...>
struct accum2_help;

template <int Acc, int X, int... Rest> 
struct accum2_help<Acc, X, Rest...> {
  static const int value = accum2_help< Acc * X, Rest...>::value;
};

template <int Acc>
struct accum2_help<Acc> {
  static const int value = Acc;
};

// again don't accept empty packs
template <int T, int... Ts>
struct accum2 {
  static const int value = accum2_help<1, T, Ts...>::value;
};
于 2012-11-22T15:25:04.337 に答える