सी ++ में एनम के स्ट्रिंग का प्रतिनिधित्व करने का कोई तरीका नहीं है। लोग कस्टम कार्यों कि case XYZ return "XYZ";
उपयोगकर्ता परिभाषित एनएम के लिए to_string प्रदान करने के लिए उचित तरीके से परिभाषित उपयोगकर्ता के लिए std :: to_string ओवरराइड कर रहा है?
साथ बॉयलरप्लेट कोड उर्फ
switch
का एक बहुत निश्चित रूप से कस्टम समारोह का नाम पता करने के लिए enum के उपयोगकर्ताओं की आवश्यकता है यही कारण है कि शामिल लिख कर इस के आसपास मिलता है।
तो मैंने सोचा कि मैं std::to_string
पर एक विशेषज्ञता जोड़ सकता हूं ताकि उपयोगकर्ता को मेरे enums पर to_string
का उपयोग करने में सक्षम बनाया जा सके। कुछ इस तरह:
//
#include <iostream>
#include <string>
#include <cassert>
#define TEST
class Car
{
public:
enum class Color
{
Red,
Blue,
White
};
};
#ifdef TEST
#include <string>
namespace std
{
std::string to_string (Car::Color c)
{
switch (c)
{
case Car::Color::Red:
return "Red";
case Car::Color::Blue:
return "Blue";
case Car::Color::White:
return "White";
default:
{
assert(0);
return "";
}
}
}
}
#endif
int main()
{
std::cout << std::to_string(Car::Color::White) << std::endl;
}
क्या इस समाधान के साथ कोई समस्या है?
पर कुछ भी जोड़ने की आवश्यकता नहीं है, मुझे नहीं लगता कि ओवरलोडिंग एसडीडी फ़ंक्शंस की अनुमति है, केवल टेम्पलेट्स की विशेषता है। – chris
दो चीजें: मैं '#define str (x) # x' (और संबंधित' #define गोंद (ए, बी) एक ## बी') का उपयोग देखने के लिए देखता हूं यह देखने के लिए कि क्या कम बॉयलरप्लेट के साथ आपकी ज़रूरतों को पूरा करता है या नहीं । बस इसे सुरक्षा के लिए फ़ंक्शन में लपेटना सुनिश्चित करें, और इसे पूरा करने के ठीक बाद इसे '# undef'' करने के लिए सुनिश्चित करें। दूसरा, और कम महत्वपूर्ण बात यह है कि क्या आप अपने स्विच में 'ब्रेक' भूल गए हैं - संभवतः यदि आप सुपर यूनिट-टेस्टी महसूस नहीं कर रहे हैं तो इसका उपयोग न करें। – FizzixNerd