c++ - 如何使用 C++11 lambda 作为 boost 谓词?

标签 c++ boost c++11 lambda

我想拆分一个wstring进入 vector<wstring>使用单个分隔符。 此字符在头文件中定义为单个 char . 为了保持代码的整洁和可读性,我真的很想在一行中完成此操作 :) 我找不到要使用的谓词,所以我决定使用 C++11 lambda。

#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;
}

不幸的是,这会导致编译错误 (clang 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 不(完全?)在 boost 中得到支持?

是否有另一种可读的单行解决方案?

我目前正在使用自己的谓词 is_char()我在一些基础库中定义了它,但我宁愿摆脱它​​。

我知道 boost lambda(还没有用过)——但它们真的应该用在 C++11 代码中吗?

谢谢!

最佳答案

冒险尝试在包含第一个 boost header 之前定义它(注意预编译 header ):

#define BOOST_RESULT_OF_USE_DECLTYPE

或者 - 反过来

#define BOOST_RESULT_OF_USE_TR1

我相信默认值已经改变。最近。对于特定的编译器,所以这可以很好地解释它。

关于c++ - 如何使用 C++11 lambda 作为 boost 谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21937236/

相关文章:

c++ - statvfs 可以阻止某些网络设备吗?这种情况怎么处理?

c++ - 至少一个字符的正则表达式

由于设置 `set_verify_mode(boost::asio::ssl::verify_none);` 造成的安全后果

c++ - boost vec(x,y,z)函数在哪里定义

c++ - 使用复杂数据结构时内存泄漏( vector 数组的数组)

c++ - 为什么编译器不能将 const int 绑定(bind)到右值引用?

c++ - 无法重载 [] 运算符

c++ - SUBSEQ spoj 中的错误答案

c++ - 不确定如何在我的主函数中调用我的类(编译)

c++ - 模板作为函数模板的参数 - 推导失败