我想使用单个分隔符将wstring
拆分为vector<wstring>
。 该字符在头文件中定义为单个char
。 为了保持代码清洁可读,我真的很想在一行上做到这一点:) 我找不到要使用的谓词,所以我决定使用C++ 11 lambda。如何使用C++ 11 lambda作为boost谓词?
#include <boost/algorithm/string/split.hpp>
#include <vector>
#include <string>
constexpr char separator = '.'; // This is how it's declared in some header file
int main()
{
std::wstring text(L"This.is.a.test");
std::vector<std::wstring> result;
// can't use is_any_of() unless i convert it to a wstring first.
boost::algorithm::split(result, text, [](wchar_t ch) -> bool { return ch == (wchar_t) separator; });
return 0;
}
不幸的是,这会导致编译错误(铛3.3):
clang++ -c -pipe -fPIC -g -std=c++11 -Wextra -Wall -fPIE -DQT_QML_DEBUG -DQT_DECLARATIVE_DEBUG -I/usr/include -I/usr/lib64/qt5/mkspecs/linux-clang -I../splittest -I. -o debug/main.o ../splittest/main.cpp
In file included from ../splittest/main.cpp:1:
In file included from /usr/include/boost/algorithm/string/split.hpp:16:
/usr/include/boost/algorithm/string/iter_find.hpp:148:13: error: non-type template argument refers to function 'failed' that does not have linkage
BOOST_CONCEPT_ASSERT((
^~~~~~~~~~~~~~~~~~~~~~
/usr/include/boost/concept/assert.hpp:44:5: note: expanded from macro 'BOOST_CONCEPT_ASSERT'
BOOST_CONCEPT_ASSERT_FN(void(*)ModelInParens)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/boost/concept/detail/general.hpp:70:6: note: expanded from macro 'BOOST_CONCEPT_ASSERT_FN'
&::boost::concepts::requirement_<ModelFnPtr>::failed> \
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/boost/algorithm/string/split.hpp:146:40: note: in instantiation of function template specialization 'boost::algorithm::iter_split<std::vector<std::basic_string<wchar_t>, std::allocator<std::basic_string<wchar_t> > >, std::basic_string<wchar_t>, boost::algorithm::detail::token_finderF<<lambda at ../splittest/main.cpp:13:44> > >' requested here
return ::boost::algorithm::iter_split(
^
../splittest/main.cpp:13:23: note: in instantiation of function template specialization 'boost::algorithm::split<std::vector<std::basic_string<wchar_t>, std::allocator<std::basic_string<wchar_t> > >, std::basic_string<wchar_t>, <lambda at ../splittest/main.cpp:13:44> >' requested here
boost::algorithm::split(result, text, [](wchar_t ch) -> bool { return ch == (wchar_t) separator; });
^
/usr/include/boost/concept/detail/general.hpp:46:17: note: non-type template argument refers to function here
static void failed() { ((Model*)0)->constraints(); }
^
1 error generated.
我做得不对或不(完全?)支持增强C++ 11-lambda表达式?
是否有另一种不太可读的单线解决方案?
我目前使用自己的谓词is_char()
,我在一些基本库中定义,但我宁可摆脱它。
我知道boost lambda(还没有使用过它们) - 但是它们是否应该在C++ 11代码中使用?
谢谢!
[Works for me。](http://coliru.stacked-crooked.com/a/c2b2bcd429b500bc) – chris
什么版本的boost?一些旧版本的boost与C++ 11 – Jagannath
不兼容,它的增强1.53。你使用哪个版本的boost和C++编译器,chris? –