2013-08-14 41 views
5

Để tính toán thừa tôi có thể sử dụng:Recursive mẫu Lập trình meta

template<int N> struct factorial { enum { value = N * factorial<N-1>::value }; }; 

template<> struct factorial<1> { enum { value = 1 }; }; //base Case 

và sau đó có thể sử dụng nó như sau

x=factorial<8>::value;

Vì vậy, là nó có thể để có được mẫu đệ quy tương tự cho

unsigned Log2(unsigned n, unsigned p = 0) { 
    return (n <= 1) ? p : Log2(n/2, p + 1); 
} 

Tôi có thể nghĩ về điều này:

template<int N,unsigned int P=0> struct Log2 
    { enum { value = Log2<N/2,P+1>::value }; }; 

Nhưng không biết cách đặt trường hợp cơ bản.

template<> struct Log2<0,???> { enum { value = ???? }; }; 

Bất kỳ ý tưởng nào?

Trả lời

8

Bạn có thể sử dụng đặc tả từng phần

template <unsigned p> 
struct Log2<0, p> { enum { value = p }; }; 

template <unsigned p> 
struct Log2<1, p> { enum { value = p }; }; 

Trong C++ 11, thay vì tạo ra một mẫu, bạn có thể biến các chức năng để constexpr để thay thế.

constexpr unsigned Log2(unsigned n, unsigned p = 0) { 
    return (n <= 1) ? p : Log2(n/2, p + 1); 
} 

std::array<int, Log2(256)> x {{1, 2, 3, 4, 5, 6, 7, 8}}; 
//    ^^^^^^^^^ Just a compile-time function call. 
+0

cảm ơn, tôi nghĩ nó phải là 'giá trị = p-1'? – P0W

+0

@ P0W: Tôi chỉ đang sử dụng triển khai của bạn, trả về 'p' khi' n <= 1'. – kennytm

+0

yeah got it thanks – P0W

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