2014-05-20 11 views
9

में जा सकते हैं? यदि प्रकारों को जाति योग्य (स्पष्ट रूप से या स्पष्ट रूप से) चेक करना संभव है (सी ++ में)? क्या std में कुछ है या क्या यह संभव है कि C# (C# same Question) में कोई फ़ंक्शन लिखें?जांचें कि क्या (आदिम) प्रकार C++

मैं इस चेक को प्रकार पर इस प्रकार के उदाहरण नहीं करना चाहता हूं।

मुझे सी ++ में टाइप सिस्टम के बारे में निश्चित नहीं है। क्या सी # या जावा में Type कक्षा की तरह कुछ है? typeid(int) मुझे मिला सबसे नजदीक था। क्या मैं एक प्रकार को एक चर में स्टोर कर सकता हूं? करीब पढ़ने की युक्तियों की सराहना की जाएगी।

उदाहरण में:

bool isCastable(false); 
bool withoutLoss(true); 
isCastable = isCastableFromTo(typeid(int), typeid(__int64), withoutLoss); //true 
isCastable = isCastableFromTo(typeid(int), typeid(short), withoutLoss); //false 
isCastable = isCastableFromTo(typeid(int), typeid(double), withoutLoss); //true 
isCastable = isCastableFromTo(typeid(double), typeid(int), withoutLoss); //false 
isCastable = isCastableFromTo(typeid(string), typeid(int), withoutLoss); //false 

withoutLoss = false; 
isCastable = isCastableFromTo(typeid(int), typeid(__int64), withoutLoss); //true 
isCastable = isCastableFromTo(typeid(int), typeid(short), withoutLoss); //true 
isCastable = isCastableFromTo(typeid(int), typeid(double), withoutLoss); //true 
isCastable = isCastableFromTo(typeid(double), typeid(int), withoutLoss); //true 
isCastable = isCastableFromTo(typeid(string), typeid(int), withoutLoss); //false 
+1

static_cast, या संकेत के लिए dynamic_cast आप मदद कर सकता है, लेकिन यह सब आपके उपयोग के मामले –

+4

सी में पर निर्भर करता है ++ शीर्षक पर नज़र (http://www.cplusplus.com/reference/type_traits/)। आपको शायद std :: is_convertible टाइप विशेषता उपयोगी मिलती है। – lego

+1

भी http://en.cppreference.com/w/cpp/types/bad_cast – user2485710

उत्तर

3

सी ++ 11 में आप उपयोग कर सकते हैं std::is_convertible (reference)। यह जांचता है कि एक अंतर्निहित रूपांतरण संभव है या नहीं। यह नहीं मानता कि रूपांतरण हानिकारक होगा या नहीं।


उदाहरण:

#include <type_traits> 
bool f_to_i = std::is_convertible<float,int>::value; // true 
bool i64_to_i = std::is_convertible<int64_t,int>::value; // true 
bool str_to_i = std::is_convertible<std::string,int>::value; // false 
1

इस तरह:

template <class F, class T, class = T> 
struct is_static_castable : std::false_type 
{}; 

template <class F, class T> 
struct is_static_castable<F, T, decltype(static_cast<T>(std::declval<F>()))> : std::true_type 
{}; 
+0

ओपी ने स्वयं को सी ++ 03 पर स्पष्ट रूप से प्रतिबंधित कर दिया है, प्रश्न के तहत टिप्पणियां देखें। अनुमोदित, टैग गुम था (मैंने अभी इसे जोड़ा)। – Quentin

संबंधित मुद्दे