如何在现代C ++中存储具有不同签名的功能对象

梅罗芬根

我想知道是否有一种方法可以将仅具有现代C ++的具有不同签名的功能对象(函数,回调,...)存储在标准容器(std :: map)中。管理容器的库不知道其“客户端”将使用哪些签名。

我的需求与此处公开的需求相同:如何在容器中存储具有不同签名的功能对象?,而这个解决方案https://stackoverflow.com/a/8304873/4042960对我来说是完美的:我只想做同样的事情而无需加倍努力。据我所知,没有std :: any。对我来说,最好的解决方案是存储std :: function而不对其进行专门化处理,但是如果可能的话,我不知道该怎么做。

编辑:

用您给我的答案,我写了这个例子:

#include <map>
#include <memory>
#include <functional>
#include <string>
#include <iostream>
#include <stdexcept>

class FunctionMap
{
    struct Base {
        virtual ~Base() {}
    };

    template<class R, class... Args>
    struct Func : Base
    {
        std::function<R(Args...)> f;
    };

    std::map<std::string, std::shared_ptr<Base> > _map;

public:

    template<class R, class... Args>
    void store(const std::string &key, const std::function<R(Args...)> &f) {
        auto pfunc = std::make_shared<Func<R, Args...> >();
        pfunc->f = f;
        _map.insert(std::make_pair(key, pfunc));
    }

    template<class R, class... Args>
    std::function<R(Args...)> get(const std::string &key) {
        auto pfunc = std::dynamic_pointer_cast<Func<R, Args...> >(_map[key]);
        if (pfunc)
            return pfunc->f;
        else
            throw std::runtime_error("Bad type for function's parameters");
    }
};

// test

int plus(int a, int b) { return a+b; }

double multiplies(double x, double y) { return x*y; }

int main()
{
    FunctionMap fm;

    fm.store("plus", std::function<int(int, int)>(&plus));
    fm.store("multiplies", std::function<double(double, double)>(&multiplies));
//    fm.store("square", std::bind(&multiplies, std::placeholders::_1, std::placeholders::_1));

    std::cout << "5 + 3 = " << fm.get<int, int, int>("plus")(5, 3) << std::endl;
    std::cout << "5 * 3 = " << fm.get<double, double, double>("multiplies")(5.0, 3.0) << std::endl;

    return 0;
}

这很好用,但是我想对其进行一些改进:

1)我希望能够使用std::bindfm.store("square", std::bind(&multiplies, std::placeholders::_1, std::placeholders::_1));但目前无法编译;

2)我想用fm.get<int (int, int)>("plus")代替,fm.get<int, int, int>("plus")但我不知道该怎么做。

非常感谢您的帮助 !

塞巴斯蒂安·雷德尔(Sebastian Redl)

您可以自己编写any没有所有的编译器变通办法和东西,boost::any可以用大约30行代码编写。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在现代 C++ 中管理连续的内存块?

来自分类Dev

如何在现代C ++中将不同类类型的对象存储到一个容器中?

来自分类Dev

如何在现代C ++中没有宏的情况下实现系统特定的功能

来自分类Dev

在C ++中具有功能对象自动检测类型

来自分类Dev

Scala:如何通过功能对象参数实现签名不同的通用流程?

来自分类Dev

如何在Codeigniter中实现代码

来自分类Dev

如何在现代C ++中表达引用关系而不表达所有权?

来自分类Dev

如何在C#中的WPF现代UI中通过按钮导航链接?

来自分类Dev

如何创建具有不同签名的功能片?

来自分类Dev

如何在python中更改功能对象的属性?

来自分类Dev

如何在现代OpenGL中渲染多个纹理?

来自分类Dev

如何在现代Delphi中为AnsiStrings使用SameText?

来自分类Dev

如何在现代Delphi中组织共享单位?

来自分类Dev

如何在python列表理解中实现代码

来自分类Dev

如何在现代Delphi中为AnsiStrings使用SameText?

来自分类Dev

如何在286中安装一些现代硬盘?

来自分类Dev

如何在现代Delphi中组织共享单位?

来自分类Dev

如何在现代linux中轻松进行图形处理?

来自分类Dev

绑定函数如何在C ++中用于功能对象

来自分类Dev

如何为现代C ++遍历JSON中的JSON

来自分类Dev

如何将pandas groupby()对象存储在具有不同索引的同一变量中

来自分类Dev

现代C ++对象关系

来自分类Dev

如何在HashMap / HashSet中存储两个相等的String或任何对象(具有不同的引用)?

来自分类Dev

如何在C ++中存储具有不同值的相同ID号?

来自分类Dev

如何在RavenDB中存储具有动态属性的C#对象?

来自分类Dev

如何在RavenDB中存储具有动态属性的C#对象?

来自分类Dev

如何使用asp.net FileUpload控件存储具有相同签名但包含不同数据的文件

来自分类Dev

在C ++中如何从不同的库调用具有相同签名的dll函数?

来自分类Dev

如何在Create React App SPA中有选择地呈现代码?

Related 相关文章

  1. 1

    如何在现代 C++ 中管理连续的内存块?

  2. 2

    如何在现代C ++中将不同类类型的对象存储到一个容器中?

  3. 3

    如何在现代C ++中没有宏的情况下实现系统特定的功能

  4. 4

    在C ++中具有功能对象自动检测类型

  5. 5

    Scala:如何通过功能对象参数实现签名不同的通用流程?

  6. 6

    如何在Codeigniter中实现代码

  7. 7

    如何在现代C ++中表达引用关系而不表达所有权?

  8. 8

    如何在C#中的WPF现代UI中通过按钮导航链接?

  9. 9

    如何创建具有不同签名的功能片?

  10. 10

    如何在python中更改功能对象的属性?

  11. 11

    如何在现代OpenGL中渲染多个纹理?

  12. 12

    如何在现代Delphi中为AnsiStrings使用SameText?

  13. 13

    如何在现代Delphi中组织共享单位?

  14. 14

    如何在python列表理解中实现代码

  15. 15

    如何在现代Delphi中为AnsiStrings使用SameText?

  16. 16

    如何在286中安装一些现代硬盘?

  17. 17

    如何在现代Delphi中组织共享单位?

  18. 18

    如何在现代linux中轻松进行图形处理?

  19. 19

    绑定函数如何在C ++中用于功能对象

  20. 20

    如何为现代C ++遍历JSON中的JSON

  21. 21

    如何将pandas groupby()对象存储在具有不同索引的同一变量中

  22. 22

    现代C ++对象关系

  23. 23

    如何在HashMap / HashSet中存储两个相等的String或任何对象(具有不同的引用)?

  24. 24

    如何在C ++中存储具有不同值的相同ID号?

  25. 25

    如何在RavenDB中存储具有动态属性的C#对象?

  26. 26

    如何在RavenDB中存储具有动态属性的C#对象?

  27. 27

    如何使用asp.net FileUpload控件存储具有相同签名但包含不同数据的文件

  28. 28

    在C ++中如何从不同的库调用具有相同签名的dll函数?

  29. 29

    如何在Create React App SPA中有选择地呈现代码?

热门标签

归档