Я хотел бы написать что-то вроде
char f(char);
vector<char> bar;
vector<char> foo = map(f, bar);
Функция преобразования
выглядит аналогично, но не будет автогенерация размера результирующей коллекции.
Чтобы это работало, вам потребуются следующие наблюдения:
map
должна не делать работа.Вместо этого он должен сохранять свои аргументы во временном объекте (в вашем случае это будет экземпляр class map::result >
)map::result
должен иметь преобразование template operator T
. map::result
присваивается std::vector
, это преобразование является единственно возможным. class map::result >::operator vector
у вас есть тип ввода и возврата, а также отображение функция. На этом этапе вы можете эффективно преобразовать входные данные. template<typename CONT, typename FUNC>
class mapresult {
CONT const& in;
FUNC f;
public:
template<typename RESULT> RESULT to() const
{
RESULT out;
for (auto const& e : in) { out.push_back(f(e)); }
return out;
}
template<typename RESULT> operator RESULT() const
{
return this->to<RESULT>();
}
mapresult(CONT const& in, FUNC f) : in(in), f(std::move(f)) { }
};
template<typename CONT, typename FUNC>
auto map(CONT const& in, FUNC f) -> mapresult<CONT, FUNC>
{
return mapresult<CONT, FUNC>(in, f);
}
using namespace std;
char foo(char c) { return c | ('A' ^ 'a'); }
std::string in = "Test";
int main(int argc, char* argv[])
{
string out = map(in, &foo);
cout << out << endl;
char replace = 'e';
cout << map(in, [replace](char c){return c == replace ? '?' : c; }).to<string>();
}