Soy un programador de Scala/Java que busca reintroducirse en C++ y aprender algunas de las características interesantes en C++ 0x. Quería comenzar diseñando mi propia biblioteca de colecciones ligeramente funcional, basada en las colecciones de Scala, para poder obtener una comprensión sólida de las plantillas. El problema al que me estoy enfrentando es que el compilador no parece ser capaz de inferir ningún tipo de información para los objetos de función con plantilla.C++ 0x función objeto de función inferencia
FC++ parece haber resuelto esto usando "Firmas". Estos parecen muy similares al tipo de nombre result_type, y pensé que obtendría esto usando la nueva sintaxis de la función. ¿Alguien puede sugerir una manera de hacer este tipo de cosas en C++ 0x, si es posible, o al menos explicar cómo FC++ fue capaz de lograr esto? He aquí un fragmento de código que estaba jugando con
#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.
}
¡Gracias! Esto funciona perfectamente No pensé mover la plantilla al operador. Aprecio el consejo sobre declval también. Tengo un seguimiento breve: ¿hay alguna manera de hacerlo utilizando un puntero de función con plantillas? Por ejemplo, si tenemos una función de impresión de plantilla, podría llamar a iterable.foreach (& print); Creo que la respuesta es no. –