Я хочу имитировать метод Руби map()
в C ++. Я изо всех сил пытаюсь выяснить тип возвращаемого значения автоматически:
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
typedef std::string T2;
template<class T1,
// class T2, // gives "couldn't deduce template parameter 'T2'"
class UnaryPredicate>
std::vector<T2> map(std::vector<T1> in, UnaryPredicate pred)
{
std::vector<T2> res(in.size());
std::transform(in.begin(), in.end(), res.begin(), pred);
return res;
}
int main()
{
std::vector<int> v1({1,2,3});
auto v2(map(v1, [](auto el) { return "'"+std::to_string(el+1)+"'"; }));
std::cout << v2[0] << "," << v2[1] << "," << v2[2] << std::endl;
}
Таким образом, он компилируется, но T2
фиксируется на string
. Если я использую другое определение T2
, компилятор жалуется couldn't deduce template parameter 'T2'
. Я также пытался использовать std::declval
, но, вероятно, не правильно - я не смог решить проблему.