मैं एक स्कैला/जावा प्रोग्रामर हूं जो स्वयं को C++ पर पुन: पेश करने की तलाश में है और C++ 0x में कुछ रोमांचक विशेषताओं को सीखता हूं। मैं स्कैला के संग्रह के आधार पर अपनी खुद की थोड़ा कार्यात्मक संग्रह लाइब्रेरी तैयार करके शुरू करना चाहता था, ताकि मैं टेम्पलेट्स की ठोस समझ प्राप्त कर सकूं। जिस समस्या में मैं चल रहा हूं वह यह है कि संकलक टेम्पलेट फ़ंक्शन ऑब्जेक्ट्स के लिए किसी भी प्रकार की जानकारी का अनुमान लगाने में सक्षम नहीं प्रतीत होता है।सी ++ 0 एक्स टेम्पलेट फ़ंक्शन ऑब्जेक्ट अनुमान
FC++ "हस्ताक्षर" का उपयोग करके इसे हल किया गया प्रतीत होता है। ये परिणाम_ टाइप टाइपनाम के समान ही प्रतीत होते हैं, और मैंने सोचा कि मुझे यह नया फ़ंक्शन सिंटैक्स का उपयोग करके मिल जाएगा। क्या कोई इस तरह की चीज को सी ++ 0x में करने का तरीका सुझा सकता है, यदि यह संभव है, या कम से कम समझाएं कि एफसी ++ इसे कैसे पूरा करने में सक्षम था? यहाँ कोड का एक टुकड़ा मैं
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
template<class T>
class ArrayBuffer {
private:
vector<T> array;
public:
ArrayBuffer();
ArrayBuffer(vector<T> a) : array(a) {}
template<typename Fn>
void foreach(Fn fn) {
for(unsigned int i = 0; i < array.size(); i++) fn(array[i]);
}
template<typename Fn>
auto map(Fn fn) -> ArrayBuffer<decltype(fn(T()))> {
vector<decltype(fn(T()))> result(array.size());
for(int unsigned i = 0; i < array.size(); i++) result[i] = fn(array[i]);
return result;
}
};
template<typename T>
class Print {
public:
void operator()(T elem) { cout<<elem<<endl; }
};
template<typename T>
class Square{
public:
auto operator()(T elem) -> T {
return elem * elem;
}
};
int main() {
vector<int> some_list = {5, 3, 1, 2, 4};
ArrayBuffer<int> iterable(some_list);
ArrayBuffer<int> squared = iterable.map(Square<int>()); // works as expected
iterable.foreach(Print<int>()); // Prints 25 9 1 4 16 as expected
iterable.foreach(Print()); // Is there a way or syntax for the compiler to infer that the template must be an int?
ArrayBuffer<int> squared2 = iterable.map(Square()); // Same as above - compiler should be able to infer the template.
}
धन्यवाद! यह पूरी तरह से काम करता है। मैंने ऑपरेटर को टेम्पलेट को स्थानांतरित करने के बारे में नहीं सोचा था। मैं भी घोषणा के बारे में टिप की सराहना करता हूं। मेरे पास एक संक्षिप्त अनुवर्ती है - क्या एक टेम्पलेटेड फ़ंक्शन पॉइंटर का उपयोग करके ऐसा करने का कोई तरीका है? उदाहरण के लिए, यदि हमारे पास टेम्पलेट प्रिंट फ़ंक्शन है, तो मैं iterable.foreach (और प्रिंट) को कॉल कर सकता हूं; मेरा मानना है कि जवाब नहीं है। –