Tại thời gian biên dịch trong C++ 11 trong một hàm mẫu có 2 tham số mẫu, cả hai đều là các kiểu số nguyên không dấu, tôi muốn có một biến cục bộ có kiểu của bất kỳ tham số mẫu nào có nhiều bit. Trong C++ 03 Tôi có thể viết một cái gì đó như:C++ 11 cách viết mẫu để chọn loại số nguyên lớn hơn?
template<bool, class T, class U>
struct pick_first;
template<class T, class U>
struct pick_first<true, T, U> {
typedef T type;
};
template<class T, class U>
struct pick_first<false, T, U> {
typedef U type;
};
template<class T, class U>
struct pick_bigger {
typedef typename pick_first<(sizeof(T) >= sizeof(U)), T, U>::type type;
};
// usage
template<class uintX_t, class uintY_t>
void foo() {
typename pick_bigger<uintX_t, uintY_t>::type mylocal = 0;
// insert doing stuff with mylocal here
}
Tôi có thể tận dụng bất kỳ tính năng C++ 11 mới nào để đơn giản hơn không? Tôi biết tôi có thể sử dụng các mẫu variadic để làm cho nó hoạt động với nhiều hơn chỉ là các cặp, và thay vì sử dụng pick_first tôi có thể viết rất nhiều chuyên môn để làm cho nó hoạt động với các kiểu int_leastX_t và int_fastX_t mới. Nhưng tôi tò mò nếu có một cách tiếp cận đơn giản hơn cho điều này. Có lẽ bằng cách nào đó tận dụng auto/constexpr/decltype?
Bạn đã xem 'std :: common_type' –
Tôi chưa từng nghe nói về std :: common_type! Rất thú vị. Điều này sẽ làm việc cho tôi. Bạn nên đăng bài như một câu trả lời mặc dù vậy tôi có thể bỏ phiếu cho bạn;) –
@ DavidRodríguez-dribeas Nhưng 'common_type' sẽ không phải lúc nào cũng hoạt động do các quy tắc khuyến mãi số nguyên. Ví dụ: 'std :: common_type :: type' là' int', có thể lớn hơn một trong hai loại. –
Praetorian