Bạn đang thực hiện một vài sai lầm. Mẫu chính mong đợi các loại, không phải là hằng số không thể thiếu. Bạn cũng cố gắng tạo mẫu với các hằng số tách rời là , nhưng chuyên môn từng phần của bạn sử dụng các loại.
Đây là chặt chẽ hơn:
#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
}
Nhưng điều này là không thực sự những gì chúng ta muốn, phải không? Và nó cũng vụng về.
#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
}
Một biến thể đơn giản xử lý chỉ 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;
};
Nếu nó không biên dịch, những gì được trình biên dịch phàn nàn về? –
Các mẫu biến thể từ lâu đã được triển khai trong gcc. Nếu bạn muốn kiểm tra hỗ trợ tính năng: http://gcc.gnu.org/projects/cxx0x.html –