मेरे पास निम्न फ़ंक्शन टेम्पलेट है:

#ifndef FUNCTIONS_H
#define FUNCTIONS_H

#include <iostream>
#include <string>
#include <vector>

template <typename Streamable>
void printall(std::vector<Streamable>& items, std::string sep = "\n")
{
    for (Streamable item : items)
        std::cout << item << sep;
}

#endif

अब मैं इसके बजाय sep का डिफ़ॉल्ट मान std::endl पर सेट करना चाहता हूं, जो एक फ़ंक्शन है, std::string नहीं। लेकिन मैं यह भी चाहूंगा कि उपयोगकर्ता std::string में पास हो सके। मुझे तर्क sep के प्रकार को दोनों को स्वीकार करने के लिए कैसे निर्दिष्ट करना चाहिए, एक मनमाना std::string और साथ ही std::endl?

1
Richard Neumann 18 अप्रैल 2021, 17:45
आपको उसी प्रकार का उपयोग करना चाहिए जैसा कि std::endl घोषणा। लेकिन आपके कार्यान्वयन से वास्तव में आपको क्या परेशान करता है?!?
 – 
πάντα ῥεῖ
18 अप्रैल 2021, 17:48
2
std::endl एक फ़ंक्शन है, जो \n को आउटपुट करता है और फिर स्ट्रीम पर flush() को कॉल करता है। आप प्रत्येक आइटम के बाद फ्लश क्यों करना चाहते हैं? यदि आप बिल्कुल फ्लश करना चाहते हैं, तो लूप के बाद एक बार ऐसा करना समझ में आता है।
 – 
Igor Tandetnik
18 अप्रैल 2021, 17:49
3
अगर आप जोर देते हैं: template <typename Streamable, typename Sep = decltype(std::endl<char, std::char_traits<char>>)> void printall(std::vector<Streamable>& items, Sep sep = std::endl) डेमो। यह एक विभाजक के रूप में कुछ भी स्वीकार करता है जिसे std::cout लिखा जा सकता है (न कि केवल तार और std::endl)
 – 
Igor Tandetnik
18 अप्रैल 2021, 17:55
2
धन्यवाद। मैंने इसे पढ़ा, क्योंकि यह केवल टेम्पलेट का विस्तार करके काम करता है। अब मुझे विश्वास हो गया है कि मैं ऐसा नहीं करना चाहता।
 – 
Richard Neumann
18 अप्रैल 2021, 17:59
3
आप दो ओवरलोड भी लिख सकते हैं, एक जो एक पैरामीटर लेता है और std::endl का उपयोग करता है, और दूसरा जो दो पैरामीटर लेता है, दूसरा बिना डिफ़ॉल्ट तर्क के std::string है।
 – 
Igor Tandetnik
18 अप्रैल 2021, 18:00

1 उत्तर

सबसे बढ़िया उत्तर

यदि आप चाहते हैं कि दूसरे पैरामीटर के लिए डिफ़ॉल्ट मान std::endl हो, तो आप केवल एक ओवरलोड जोड़ सकते हैं जो केवल एक पैरामीटर लेता है, और string ओवरलोड के लिए डिफ़ॉल्ट प्रदान नहीं करता है। यह आपको वह अधिभार सेट देगा जो आप चाहते हैं।

template <typename Streamable>
void printall(std::vector<Streamable>const & items)  // gets called when second 
                                                     // argument is not passed in
{
    for (Streamable const & item : items)
        std::cout << item << std::endl;
}

template <typename Streamable>
void printall(std::vector<Streamable> const & items, std::string const & sep)
{
    for (Streamable const & item : items)
        std::cout << item << sep;
}
1
cigien 19 अप्रैल 2021, 05:46