यहाँ एक समाधान है कि रूपांतरण चौड़ा करने की अनुमति है और सीमित करने वाले रोका जा सके है:
#include <cstdint>
#include <type_traits>
void foo(uint16_t x) {
}
template <class T>
typename std::enable_if<sizeof(uint16_t) < sizeof(T)>::type foo(const T& t) = delete;
int main() {
uint64_t x = 10000;
uint16_t y = 10000;
uint8_t z = 100;
// foo(x); // ERROR: narrowing conversion
foo(y); // OK: no conversion
foo(z); // OK: widening conversion
return 0;
}
मामले में आप भी हस्ताक्षर किए प्रकार के तर्क के साथ कॉल अस्वीकृत करने के लिए चाहते हैं (पर हस्ताक्षर किए और अहस्ताक्षरित प्रकार के बीच रूपांतरण नहीं है " दोषरहित "), तो आपको निम्न घोषणा के बजाय इस्तेमाल कर सकते हैं:
#include <cstdint>
#include <type_traits>
void foo(uint16_t x) {
}
template <class T>
typename std::enable_if<(sizeof(uint16_t) < sizeof(T)) ||
(std::is_signed<T>::value != std::is_signed<uint16_t>::value)
>::type
foo(const T& t) = delete;
int main() {
uint64_t u64 = 10000;
uint16_t u16 = 10000;
uint8_t u8 = 100;
int64_t s64 = 10000;
int16_t s16 = 10000;
int8_t s8 = 100;
//foo(u64); // ERROR: narrowing conversion
foo(u16); // OK: no conversion
foo(u8); // OK: widening conversion
//foo(s64); // ERROR: narrowing conversion AND signed/unsigned mismatch
//foo(s16); // ERROR: signed/unsigned mismatch
//foo(s8); // ERROR: signed/unsigned mismatch
return 0;
}
स्रोत
2015-06-02 08:50:31
क्यों नहीं करना चाहिए ' यह नहीं है? –
सी ++ में रूपांतरणों को संक्षिप्त करने की अनुमति है, और हस्ताक्षरित संकुचित रूपांतरण अच्छी तरह से परिभाषित हैं –
'-Werror = रूपांतरण' जोड़ना आपके उदाहरण को संकलित नहीं करेगा। – Praetorian