यहां एक वैकल्पिक समाधान है। कुछ भी जरूरी नहीं कि अधिक सुरुचिपूर्ण या बहुत फैंसी, लेकिन यह एक वैकल्पिक दृष्टिकोण है। यह मानता है कि आपके द्वारा toSting() फ़ंक्शन पर to_string को कॉल करने का इरादा रखने वाले सभी वर्ग हैं।
यहां एक फ़ंक्शन टेम्पलेट है जो केवल क्लास प्रकार की वस्तुओं के साथ काम करेगा, और ToString() फ़ंक्शन को कॉल करेगा।
template<typename T, typename = std::enable_if_t<std::is_class<T>::value>>
std::string to_string(const T& t) {
return t.ToString();
}
शायद हम इसे std :: स्ट्रिंग के साथ भी काम करना चाहते हैं।
template<>
std::string to_string(const std::string& t) {
return t;
}
यहां उपयोग के कोड का एक उदाहरण दिया गया है। डमी नेमस्पेस to_s नोट करें। मुझे लगता है कि यदि आप मुख्य फ़ंक्शन में std :: to_string का उपयोग करते हैं, तो यह हमारे टेम्पलेट फ़ंक्शन नाम पर कदम उठाता है, इसलिए हमें इस तरह अप्रत्यक्ष रूप से नाम पेश करना होगा। अगर कोई ऐसा करने का सही तरीका जानता है तो मैं एक टिप्पणी की सराहना करता हूं।
#include <cstring>
#include <iostream>
#include <string>
#include <type_traits>
union U {
double d;
const char* cp;
};
struct A {
enum State { kString, kDouble };
State state;
U u;
void Set(const char* cp) {
u.cp = cp;
state = kString;
}
std::string ToString() const {
switch (state) {
case A::kString : return std::string(u.cp); break;
case A::kDouble : return std::to_string(u.d); break;
default : return "Invalid State";
}
}
};
namespace to_s { using std::to_string; };
int main() {
using namespace to_s;
std::string str = "a nice string";
double d = 1.1;
A a { A::kDouble, {1.2} };
std::cout << "str: " << to_string(str) << ", d: " << to_string(d) << std::endl;
std::cout << "a: " << to_string(a) << std::endl;
a.Set(str.c_str());
std::cout << "a: " << to_string(a) << std::endl;
std::memset(&a, 'i', sizeof(a));
std::cout << "a: " << to_string(a) << std::endl;
}
यहाँ मैं क्या मिला है:
str: एक अच्छा स्ट्रिंग, डी: 1,100000
एक: 1,200000
एक: एक अच्छा स्ट्रिंग
एक: अमान्य राज्य
स्रोत
2018-02-08 22:28:11
संबंधित [क्या कक्षा को स्ट्रिंग में बदलने का एक मानक तरीका है] (http://stackoverflow.com/q/33357480/ 1708801) –
इसके अलावा http://stackoverflow.com/questions/234724/is-it-possible-to-serialize-and-deserialize-a-class-in-c – Lol4t0
@ShafikYaghmour हाँ यह हो सकता है .. हालांकि, समाधान कक्षा को _stringable –