【发布时间】:2017-11-30 01:31:49
【问题描述】:
我想写一个 boost 适配器放在一个适配器链的末尾来创建一个集合,像这样:
set<string> s = input | filtered(...) | transformed(...) | to_set;
使用Method 3.1 我编写了下面的代码,似乎可以按预期工作:
namespace detail
{
struct to_set_forwarder
{
};
};
template <class R> inline auto operator|(R& r, detail::to_set_forwarder)
{
return set<R::value_type>(r.begin(), r.end());
}
template <class R> inline auto operator|(const R& r, detail::to_set_forwarder)
{
return set<const R::value_type>(r.begin(), r.end());
}
namespace
{
const auto to_set = detail::to_set_forwarder();
}
void F()
{
vector<string> input{ "1", "2", "3" };
auto result = input
//| boost::adaptors::filtered([](const auto& _) { return true; })
| to_set;
}
但如果我取消注释那一行,我会得到:
错误 C2338:C++ 标准禁止 const 元素的容器,因为分配器格式错误。
如果我将operator| 的第一个参数设为&&,那么直到我取消注释filtered() 行,然后我得到:
错误 C2825:“R”:后跟“::”时必须是类或命名空间
这样做的正确方法是什么?
【问题讨论】:
标签: c++ boost boost-range boost-adaptors