将C ++ 11 lambda与boost :: multi_index一起使用

斯拉瓦

尝试使用C ++ 11 lambda作为以下操作的关键访问器boost::multi_index

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/global_fun.hpp>

struct Foobar {
    int key;
};

void func()
{
    namespace mii = boost::multi_index;
    typedef boost::multi_index_container< Foobar,
            mii::hashed_unique< mii::global_fun< const Foobar &, int,
            []( const Foobar &f ) { return f.key; } > > > Container;

}

但是从g ++ 4.8.2和boost 1.53得到编译错误:

error: could not convert template argument '<lambda closure object>func()::__lambda0{}' to 'int (*)(const Foobar&)'

这个答案将Boost适配器与C ++ 11 lambda一起使用建议将std::function转换为在这种情况下不起作用。有简单的方法可以解决此问题吗?

Yakk-亚当·内夫罗蒙特

Lambda不能在未评估的上下文中使用1我不确定这是否可以视为未评估的上下文,但是涉及的方法decltype( [](int){} )2

无状态Lambda似乎没有constexpr向功能指针转换(这可能是一个疏忽),否则可以使用:

template<class T>using type=T;
template< void(*)(int) > struct test {};

constexpr type<void(int)>* f = [](int){};

int main() {
  test<f> x;
}

如果直接将lambda传递给void(*)(int)函数指针参数,它甚至可以工作

这样您就可以将lambda编写为老式函数。


1这可能是为了简化编译器的工作(据我所知,在当前标准下,头文件中lambda的类型在编译单元之间不必保持一致吗?但是我不确定。)

2这样可以防止您将其传递为纯类型,然后再调用它。Lambda也缺少构造函数。除非编译器注意到您的轻率手法,否则您可以构造无状态lambda(或对其的引用)然后调用它的hack方法,除非编译器注意到您的轻率手法,但这是未定义的行为。

这导致此hack:

#include <iostream>

auto f() { return [](){std::cout <<"hello world.\n";}; }

template<class Lambda>
struct test {
  void operator()() const {
    (*(Lambda*)nullptr)();
  }
};

int main() {
  test<decltype(f())> foo;
  foo();
}

这既是无用的又是未定义的行为,但是确实会调用test技术上作为模板参数传递给我们的lambda (C ++ 14)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++ 11:std :: bind与Lambda一起崩溃

来自分类Dev

将C ++ 11与NaCl / PNaCl一起使用

来自分类Dev

将Lambda与列表一起使用

来自分类Dev

将Lambda与列表一起使用

来自分类Dev

将autoprefixer与angular11一起使用

来自分类Dev

C ++ boost :: multi_index:iterator_to成员函数的顺序

来自分类Dev

将C ++ 11 thread_local与其他并行库一起使用

来自分类Dev

可以将基于范围的for循环与恒定整数值(C ++ 11)一起使用

来自分类Dev

将gcc属性与C ++ 11属性语法一起使用

来自分类Dev

将X11 C库与Zig一起使用时出现细分错误

来自分类Dev

将CUDA 7.0与gcc 5.2.0和c ++ 11一起使用

来自分类Dev

在gcc 4.8.2中使用C ++ 11正则表达式时,结果奇怪(但与Boost regexp一起使用)

来自分类Dev

在gcc 4.8.2中使用C ++ 11正则表达式时,结果奇怪(但与Boost regexp一起使用)

来自分类Dev

将期货与Boost线程池一起使用

来自分类Dev

将期货与Boost线程池一起使用

来自分类Dev

MessagePack,c ++:如何将MSGPACK_DEFINE与c ++ 11枚举类一起使用

来自分类Dev

如何将 Boost Variant 与 struct 对象一起使用 C++

来自分类Dev

C ++ 11如何使用Lambda和高阶函数将向量转换为不同类型的向量

来自分类Dev

C ++ Boost Lambda Cout <<

来自分类Dev

将lambda与用户输入列表一起使用

来自分类Dev

将通用Lambda与std :: find_if一起使用

来自分类Dev

将lambda与条件语句一起使用

来自分类Dev

如何将 lambda 与 C# 中的方法一起使用?

来自分类Dev

如何在C ++ 11中将std :: max与自定义比较器一起使用?

来自分类Dev

C ++ 11:如何将std :: mem_fn和std :: bind与继承一起使用

来自分类Dev

将数组用作映射键不能与C ++ 11编译器命令一起使用吗?

来自分类Dev

使用boost :: multi_index reverse_iterators

来自分类Dev

使用PKCS#11将私钥和公钥包装在一起

来自分类Dev

将Renderscript api11 +与支持v8一起使用时出错

Related 相关文章

  1. 1

    C ++ 11:std :: bind与Lambda一起崩溃

  2. 2

    将C ++ 11与NaCl / PNaCl一起使用

  3. 3

    将Lambda与列表一起使用

  4. 4

    将Lambda与列表一起使用

  5. 5

    将autoprefixer与angular11一起使用

  6. 6

    C ++ boost :: multi_index:iterator_to成员函数的顺序

  7. 7

    将C ++ 11 thread_local与其他并行库一起使用

  8. 8

    可以将基于范围的for循环与恒定整数值(C ++ 11)一起使用

  9. 9

    将gcc属性与C ++ 11属性语法一起使用

  10. 10

    将X11 C库与Zig一起使用时出现细分错误

  11. 11

    将CUDA 7.0与gcc 5.2.0和c ++ 11一起使用

  12. 12

    在gcc 4.8.2中使用C ++ 11正则表达式时,结果奇怪(但与Boost regexp一起使用)

  13. 13

    在gcc 4.8.2中使用C ++ 11正则表达式时,结果奇怪(但与Boost regexp一起使用)

  14. 14

    将期货与Boost线程池一起使用

  15. 15

    将期货与Boost线程池一起使用

  16. 16

    MessagePack,c ++:如何将MSGPACK_DEFINE与c ++ 11枚举类一起使用

  17. 17

    如何将 Boost Variant 与 struct 对象一起使用 C++

  18. 18

    C ++ 11如何使用Lambda和高阶函数将向量转换为不同类型的向量

  19. 19

    C ++ Boost Lambda Cout <<

  20. 20

    将lambda与用户输入列表一起使用

  21. 21

    将通用Lambda与std :: find_if一起使用

  22. 22

    将lambda与条件语句一起使用

  23. 23

    如何将 lambda 与 C# 中的方法一起使用?

  24. 24

    如何在C ++ 11中将std :: max与自定义比较器一起使用?

  25. 25

    C ++ 11:如何将std :: mem_fn和std :: bind与继承一起使用

  26. 26

    将数组用作映射键不能与C ++ 11编译器命令一起使用吗?

  27. 27

    使用boost :: multi_index reverse_iterators

  28. 28

    使用PKCS#11将私钥和公钥包装在一起

  29. 29

    将Renderscript api11 +与支持v8一起使用时出错

热门标签

归档