क्या तुम सच में करना चाहते हैं:
std::string sep = " ";
std::string end = "\n";
(std::cout << ... << (sep << args)) << end;
क्योंकि आप चाहते हैं (sep << args)
std::cout
के साथ बाएं-गुना होने के लिए। यह काम नहीं करता है, क्योंकि sep << args
नहीं जानता कि इसे std::cout
पर स्ट्रीम किया जा रहा है या बिल्कुल स्ट्रीम किया गया है; <<
केवल स्ट्रीमिंग है यदि बाएं हाथ की ओर एक धारा है।
संक्षेप में, समस्या यह है कि sep << args
यह समझ में नहीं आता है कि यह स्ट्रीमिंग है।
आपकी अन्य समस्या पर्याप्त लैम्ब्डा नहीं है।
हम इसे ठीक कर सकते हैं।
template<class F>
struct ostreamer_t {
F f;
friend std::ostream& operator<<(std::ostream& os, ostreamer_t&& self) {
self.f(os);
return os;
}
template<class T>
friend auto operator<<(ostreamer_t self, T&& t) {
auto f = [g = std::move(self.f), &t](auto&& os)mutable {
std::move(g)(os);
os << t;
};
return ostreamer_t<decltype(f)>{std::move(f)};
}
};
struct do_nothing_t {
template<class...Args>
void operator()(Args&&...)const {}
};
const ostreamer_t<do_nothing_t> ostreamer{{}};
template <typename... Args>
void print(Args... args)
{
std::string sep = " ";
std::string end = "\n";
(std::cout << ... << (ostreamer << sep << args)) << end;
}
live example। (मैंने रैल्यू के साथ काम करने के लिए sep
के लिए एक शाब्दिक भी उपयोग किया)।
ostreamer
चीजों के लिए संदर्भ कब्जा यह, <<
'घ है तो उन्हें उदासीनता जब बारी में यह एक ostream
को <<
है।
यह पूरी प्रक्रिया संकलक के लिए पारदर्शी होनी चाहिए, इसलिए एक सभ्य अनुकूलक को शामिल सब कुछ वाष्पित करना चाहिए।
'(std :: cout << sep << args, ...); 'यह कहता है" अभिव्यक्ति को फ़ोल्ड अभिव्यक्ति के संचालन के रूप में अनुमति नहीं है "। हालांकि यह सुझाव देता है कि मैं इसके हिस्से के चारों ओर कोष्ठक डालता हूं जैसे कि ((std :: cout << sep << args), ...); 'लेकिन वह पहला तर्क मुद्रित करता है। क्या इस लाइन का एक संस्करण है जो काम करेगा? – nickeb96
@ nickeb96 हाँ, कोष्ठक भूल गए। मुझे यकीन नहीं है कि बाकी के बारे में आपका क्या मतलब है, यह पहला तर्क नहीं छोड़ता है। – Barry
आह, मुझे दूसरा भाग मिल गया। हालांकि यह एक अग्रणी 'सीपी' प्रिंट करता है। क्या प्रत्येक तर्क के बीच केवल 'सीपी' रखने का कोई सीधा तरीका है? या क्या इसे रिकर्सन जैसे अधिक जटिल समाधान की आवश्यकता है? – nickeb96