2012-11-22 47 views
5

Có thực hiện rồi, vì điều này không biên dịch: (sử dụng gcc 4.7.2)variadic mẫu chuyên môn hóa trong C++ 11

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 
} 
+0

Nếu nó không biên dịch, những gì được trình biên dịch phàn nàn về? –

+0

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 –

Trả lời

10

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; 
}; 
+0

Vậy làm cách nào để thực hiện việc này: 1. Khai báo phiên bản '' của 'Foo' và khởi tạo nó bằng các hằng số' <2, 3> '? – Cartesius00

+0

'Foo <2, 3> x'? Nếu nó không phải là 'Foo <3, 2> x'? – Nawaz

+0

@Martin Nếu bạn muốn có thể sử dụng 'Foo' là' Foo <2, 3> ', thì có vẻ như mẫu chính bạn muốn là một cái gì đó như' template struct Foo; '. –

Các vấn đề liên quan