मैं किसी निश्चित वस्तु के लिए एक रेंज कन्स्ट्रक्टर को कार्यान्वित करना चाहता हूं, लेकिन मैं इसे केवल दो इनपुट इटरेटर्स को स्वीकार करने के लिए प्रतिबंधित करना चाहता हूं।एक कन्स्ट्रक्टर को कैसे कार्यान्वित करें ताकि यह केवल टाइपिड का उपयोग कर इनपुट इटरेटर स्वीकार कर सके?
मैंने इस कोड को gcc 7.1.0 के साथ संकलित करने का प्रयास किया है।
फ़ाइल test.cpp
#include <vector>
#include <type_traits>
#include <typeinfo>
template <typename Iterator>
using traits = typename std::iterator_traits<Iterator>::iterator_category;
template <typename T>
class A{
private:
std::vector<T> v;
public:
template <typename InputIterator,
typename = std::enable_if_t<
typeid(traits<InputIterator>) ==
typeid(std::input_iterator_tag)>
>
A(InputIterator first, InputIterator last) : v(first, last) {}
};
int main(){
std::vector<double> v = {1, 2, 3, 4, 5};
A<double> a(v.begin(), v.end());
}
मैं g++ test.cpp -o test
के साथ इस संकलन त्रुटि मिलती है:
test.cpp: In function ‘int main()’:
test.cpp:27:34: error: no matching function for call to ‘A<double>::A(std::vector<double>::iterator, std::vector<double>::iterator)’
A<double> a(v.begin(), v.end());
^
test.cpp:22:7: note: candidate: template<class InputIterator, class> A<T>::A(InputIterator, InputIterator)
A(InputIterator first, InputIterator last) : v(first, last) {}
^
test.cpp:22:7: note: template argument deduction/substitution failed:
test.cpp: In substitution of ‘template<bool _Cond, class _Tp> using enable_if_t = typename std::enable_if::type [with bool _Cond = ((const std::type_info*)(& _ZTISt26random_access_iterator_tag))->std::type_info::operator==(_ZTISt18input_iterator_tag); _Tp = void]’:
test.cpp:18:16: required from here
test.cpp:19:49: error: call to non-constexpr function ‘bool std::type_info::operator==(const std::type_info&) const’
typeid(traits<InputIterator>) ==
test.cpp:18:16: note: in template argument for type ‘bool’
typename = std::enable_if_t<
^~~~~~~~
test.cpp:10:7: note: candidate: A<double>::A(const A<double>&)
class A{
^
test.cpp:10:7: note: candidate expects 1 argument, 2 provided
test.cpp:10:7: note: candidate: A<double>::A(A<double>&&)
test.cpp:10:7: note: candidate expects 1 argument, 2 provided
मैं डिफ़ॉल्ट टेम्पलेट पैरामीटर का उपयोग करने क्योंकि निर्माताओं के लिए अधिक उपयुक्त है का फैसला किया। ऑपरेटर typeid()
का उपयोग इसलिए है क्योंकि मुझे कोड को मैप करते समय पढ़ने में वाकई आसान लगता है, लेकिन मैं इसे किसी भी तरह से काम नहीं कर सकता।
अन्य समाधान बहुत अजीब लगते हैं और वास्तव में अस्पष्ट हैं (जैसे इनपुट इटरेटर पैरामीटर को कुछ विधियों जैसे * इसे या ++ के लिए मजबूर करना)। यदि कोई रास्ता नहीं है तो मैं ऐसा कर सकता हूं, मैं एक कम या ज्यादा, आसानी से पढ़ा जाने वाला समाधान की सराहना करता हूं।
मैंने कभी इस विचार के बारे में सोचा नहीं है, जो समझने और कार्यान्वित करने में वास्तव में आसान है। आपका बहुत बहुत धन्यवाद! –