Kendimi C++ ile yeniden tanıştırmak ve C++ 0x'deki bazı heyecan verici özellikleri öğrenmek isteyen bir Scala/Java programcısıyım. Scala'nın koleksiyonlarına dayanan, kendi işlevsel kütüphanelerimi tasarlayarak başlamak istedim, böylece şablonların sağlam bir şekilde anlaşılmasını sağlayabileyim. Çalıştığım sorun, derleyicinin şablonlanmış işlev nesneleri için herhangi bir tür bilgisini çıkaramadığı görünüyor. "İmza" kullanarak bu sorunu çözdüğü anlaşılmaktadır. Bunlar result_type typename ile gerçekten benzer görünmektedir ve bunu yeni işlev sözdizimini kullanarak alacağımı düşündüm. Bu tür bir şeyi C++ 0x'da yapmanın bir yolu önerilebilir mi, yoksa mümkün mü yoksa en azından FC++ bunu nasıl başardı? İşteC++ 0x şablon işlev nesnesi çıkarsama
#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.
}
Teşekkür ederiz! Bu mükemmel çalışıyor. Şablonu operatöre taşımayı düşünmedim. Dekolt ile ilgili ipucunu da takdir ediyorum. Kısa bir takip yapmam gerekiyor - bu şekilde şablonlanmış bir işaretçi kullanarak bunu yapmanın bir yolu var mı? Örneğin, bir şablon baskı fonksiyonumuz varsa, iterable.foreach (& print); Cevabın hayır olduğuna inanıyorum. –