Я программист на Scala / Java, желаю вновь познакомиться с C ++ и изучить некоторые интересные функции в C ++ 0x.Я хотел начать с разработки моей собственной слегка функциональной библиотеки коллекций, основанной на коллекциях Scala, чтобы я мог получить полное представление о шаблонах.Проблема, с которой я сталкиваюсь, заключается в том, что компилятор, по-видимому, не может выводить какую-либо информацию о типах для объектов-шаблонов.
FC ++ , кажется, решил эту проблему с помощью «Подписи».Похоже, они действительно похожи на имя типа result_type, и я подумал, что получу это, используя новый синтаксис функции.Может кто-нибудь предложить способ сделать что-то подобное в C ++ 0x, если это возможно, или хотя бы объяснить, как FC ++ смог добиться этого?Вот фрагмент кода, с которым я играл
#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.
}