2017-06-16 14 views
14

Tôi đang cố gắng viết một lớp bao gồm biến có loại sẽ được chọn là giá trị nhỏ nhất có thể chứa giá trị.Chọn loại số nguyên nhỏ nhất dựa trên phao

Những gì tôi có nghĩa là:

class foo { 
"int type here" a; 
} 

Tôi đã xem qua Automatically pick a variable type big enough to hold a specified number. Do khó khăn khi sử dụng thư viện tăng cường, tôi đã tiếp tục và sử dụng các đề xuất mẫu.

Đó biến mã vào:

template<unsigned long long T> 
class foo { 
SelectInteger<T>::type a; 
} 

Tuy nhiên, vấn đề của tôi nảy sinh từ thực tế là kích thước của biến là kết quả khi nhân một biến dấu chấm động và số nguyên. Vì vậy, những gì tôi muốn để có thể làm là:

template<unsigned long long T, double E> 
class foo { 
SelectInteger<T*E>::type a; 
} 

Nhưng kể từ khi mẫu không làm việc với các biến điểm (xem here) nổi, tôi không thể vượt qua E trong một mẫu. Có cách nào khác tôi có thể vượt qua một biến (mà nên có sẵn trong quá trình biên dịch) cho lớp học?

Trả lời

8

Điều gì về việc sử dụng hàm constexpr?

Ý tôi là ... một cái gì đó như sau

template <unsigned long long> 
struct SelectInteger 
{ using type = int; }; 

template <> 
struct SelectInteger<0U> 
{ using type = short; }; 

constexpr unsigned long long getSize (unsigned long long ull, double d) 
{ return ull*d; } 

template <unsigned long long T> 
struct foo 
{ typename SelectInteger<T>::type a; }; 

int main() 
{ 
    static_assert(std::is_same<short, 
        decltype(foo<getSize(1ULL, 0.0)>::a)>::value, "!"); 
    static_assert(std::is_same<int, 
        decltype(foo<getSize(1ULL, 1.0)>::a)>::value, "!!"); 
} 
+0

không bao giờ biết về constexpr. Cảm ơn rất nhiều. –

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