range-v3 как действовать:: объединить с разделителем
Я получаю Range-V3 для MSVC из Git. И скомпилировать компилятором MSVC C++14.
Рассмотрим код:
auto getter2 = [](const std::string&r) { return r+r; };
std::vector<std::string> vv = { "11","22", "33" };
std::cout << (vv | view::transform(getter2) | action::join) << std::endl;
Работает как положено. Но я хочу добавить разделитель, чтобы присоединиться, и если я напишу
std::cout << (vv | view::transform(getter2) | action::join(",")) << std::endl;
Код не скомпилирован. Что случилось? Масса ошибки компилятора ниже:
1>d:\sources\ranges_test\ranges_test.cpp(28): error C2672: 'operator __surrogate_func': no matching overloaded function found
1>d:\sources\ranges_test\ranges_test.cpp(28): error C2783: 'unknown-type ranges::v3::action::action<ranges::v3::action::join_fn>::operator ()(Rng &,Rest &&...) const': could not deduce template argument for '__formal'
1>d:\sources\fingrad\dev.fingrad\src\vc\lib\range\v3\action\action.hpp(120): note: see declaration of 'ranges::v3::action::action<ranges::v3::action::join_fn>::operator ()'
1>d:\sources\ranges_test\ranges_test.cpp(28): error C2893: Failed to specialize function template 'unknown-type ranges::v3::action::action<ranges::v3::action::join_fn>::operator ()(T &&,Rest &&...) const'
1>d:\sources\ranges_test\ranges_test.cpp(28): note: With the following template arguments:
1>d:\sources\ranges_test\ranges_test.cpp(28): note: 'T=const char (&)[2]'
1>d:\sources\ranges_test\ranges_test.cpp(28): note: 'Rest={}'
1>d:\sources\ranges_test\ranges_test.cpp(28): note: 'A=ranges::v3::action::join_fn'
ОБНОВИТЬ
Не только поведение порта MSVC, но и здесь
1 ответ
Угадай: строковый литерал не является диапазоном. Попробуйте пройти std::string(",")
или же view::c_str(",")
в view::join
вместо.
ОБНОВЛЕНИЕ: Ах. Попробуйте это вместо этого (проверено с Clang trunk):
#include <range/v3/all.hpp>
#include <vector>
#include <iostream>
int main()
{
using namespace ranges;
std::vector<std::string> vv = { "11","22", "33" };
auto getter2 = [](auto&r) { return view::concat(r, r); };
std::cout << (vv | view::transform(getter2)
| view::join(',')
| to_<std::string>()) << std::endl;
return 0;
}