传递模板函数以在没有 lambda 的情况下进行转换
Pass template function to transform without lambda
我目前有 c++11 函数:
template<class IteratorIn>
std::string to_string_join(IteratorIn first, IteratorIn last, std::string joiner) {
std::vector<std::string> ss(last - first);
std::transform(
first, last, begin(ss),
[](typename std::iterator_traits<IteratorIn>::value_type d) {
return std::to_string(d);
}
);
return boost::algorithm::join(ss, joiner);
}
可以这样使用:
std::vector<int> is{-1, 2, 62, 4, -86, 23, 8, -0,2};
std::cout << to_string_join(begin(is), end(is), ", ") << std::endl;
要输出:
"-1, 2, 62, 4, -86, 23, 8, 0 ,2".
我在另一个 SO post "convert-vectordouble-to-vectorstring-elegant-way" 中读到不需要 lambda。但是我一直无法实现删除 lambda。
我想它看起来应该类似于:
std::transform(
first, last, begin(ss),
std::to_string<typename std::iterator_traits<IteratorIn>::value_type>
);
导致编译错误:
"error: expected ‘(’ before ‘>’ token".
如果没有 lambda,我怎样才能通过 to_string?
错误发生是因为std::to_string
不是函数模板。您正在寻找 static_cast
,而不是模板参数。
std::transform(
first, last, begin(ss),
static_cast<std::string(*)(typename std::iterator_traits<IteratorIn>::value_type)>(std::to_string)
);
我目前有 c++11 函数:
template<class IteratorIn>
std::string to_string_join(IteratorIn first, IteratorIn last, std::string joiner) {
std::vector<std::string> ss(last - first);
std::transform(
first, last, begin(ss),
[](typename std::iterator_traits<IteratorIn>::value_type d) {
return std::to_string(d);
}
);
return boost::algorithm::join(ss, joiner);
}
可以这样使用:
std::vector<int> is{-1, 2, 62, 4, -86, 23, 8, -0,2};
std::cout << to_string_join(begin(is), end(is), ", ") << std::endl;
要输出:
"-1, 2, 62, 4, -86, 23, 8, 0 ,2".
我在另一个 SO post "convert-vectordouble-to-vectorstring-elegant-way" 中读到不需要 lambda。但是我一直无法实现删除 lambda。
我想它看起来应该类似于:
std::transform(
first, last, begin(ss),
std::to_string<typename std::iterator_traits<IteratorIn>::value_type>
);
导致编译错误:
"error: expected ‘(’ before ‘>’ token".
如果没有 lambda,我怎样才能通过 to_string?
错误发生是因为std::to_string
不是函数模板。您正在寻找 static_cast
,而不是模板参数。
std::transform(
first, last, begin(ss),
static_cast<std::string(*)(typename std::iterator_traits<IteratorIn>::value_type)>(std::to_string)
);