2011-10-04 32 views
7

Tôi muốn viết cấu trúc mẫu foo sao cho foo<N>::value_type là số nguyên có kích thước gần nhất (làm tròn) thành N. Ví dụ: foo<32>::value_type => uint32_t, foo<33>::value_type => uint64_tfoo<72>::value_type => uint64_t.Chuyên môn mẫu cho một dải giá trị

Để làm điều này, tôi cần một phương tiện thanh lịch để cung cấp các chuyên môn một phần của foo cho một loạt các giá trị, ví dụ: 1 <= N <= 8 để trả lại uint8_t v.v ... Có phương tiện để hoàn thành điều này mà không cần phải chuyên mọi thứ từ 0 đến 64.

+0

Sẽ không có cách nào trực tiếp (như Mark đã nói), nhưng có thể một số mẹo lập trình meta lập trình thông minh. Câu hỏi hay, chờ xem câu trả lời. –

Trả lời

14
template<size_t N> struct select { typedef uint64_t result; }; 
template<> struct select<0> { typedef uint8_t result; }; 
template<> struct select<1> { typedef uint16_t result; }; 
template<> struct select<2> { typedef uint32_t result; }; 

template<size_t N> 
struct foo 
{ 
    enum{D = (N > 32 ? 3 : (N > 16 ? 2 : (N > 8 ? 1 : 0)))}; 

    typedef typename select<D>::result value_type; 

    value_type value; 
}; 

Trong bạn có thể sử dụng std::conditional:

typedef 
    typename std::conditional<(N > 32), uint64_t, 
    typename std::conditional<(N > 16), uint32_t, 
    typename std::conditional<(N > 8), uint16_t, uint8_t> 
    ::type>::type>::type value_type; 

Bạn có thể quyết định cái nào là ít có thể đọc được.

+1

Tôi thích được chứng minh là sai. –

+2

Câu trả lời hay. Không phải enum là {enum {D = (N> 32? 3: (N> 16? 2: (N> 8? 1: 0)))}; ', mặc dù? Đây là cách làm việc: http://ideone.com/OgXaz – filipe

+0

Oh wow, tôi đã làm điều này trong quá khứ, nhưng đây là _much_ đơn giản hơn phiên bản của tôi! Mặc dù tôi có bool (1), char (2-8), ..., long long (33-64), và void (65+) –

1

Thông số mẫu cần phải cụ thể, vì vậy tôi không nghĩ có cách nào để tránh chuyên về từng giá trị được yêu cầu.

7

@hansmaad Câu trả lời là một câu trả lời tốt đẹp, nhưng tôi muốn sử dụng (đoán những gì ?!) Boost:

boost::uint_t<N>::least // N: bits 

Các nhỏ nhất, tích hợp, unsigned loại tách rời với ít nhất N bit . Tham số phải là số dương. Lỗi biên dịch kết quả nếu tham số lớn hơn số bit trong loại số nguyên lớn nhất .

+0

Rất dễ thương, thậm chí nhiều hơn như vậy khi tôi đang sử dụng tăng trong dự án của tôi, nhưng nó không xử lý trường hợp của foo <72> :: value_type giải quyết cho số nguyên có sẵn lớn nhất. –

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