【问题标题】:How to put a generic function type into std::map? [duplicate]如何将泛型函数类型放入 std::map? [复制]
【发布时间】:2020-06-03 04:11:23
【问题描述】:

我可以使用泛型函数类型作为 std::map 的值吗?这消除了为不同的函数参数和返回值编写不同的 std::maps 的需要。

template<class Function,class ... Args>
inline auto FuncWrapper(Function &&f, Args && ... args)-> decltype(f(std::forward<Args>(args)...))
{
    return f(std::forward<Args>(args)...);
}

std::map<std::string, FuncWrapper>> FUNCS;

void test_map_operator()
{
    FUNCS["MD5"]([](std::string data){ return "MD5: "+ data; }, "some data");
    FUNCS["RSA"]([](std::string data, std::string key) {return "RSA: "+ data +':' + key;}, "some data", "some key");
    FUNCS["Other"]([](int a, double b, char c){return (c-'0')+a+b;}, 1, 2.0, 'c');
}

【问题讨论】:

  • 有趣的想法。我不相信有办法直接做到这一点,因为存储函数的类型会有所不同。不过,可能有一些方法可以通过添加一个间接层来实现这一点。
  • 你可以这样做,但这是个坏主意。

标签: c++ function templates stdmap


【解决方案1】:

一种可能是tagged union(但已知的)closures(或function objects)。

所以将std::functionstd::variantstd::map 结合起来。

例如,考虑有一些

std::map<std::string, 
       std::variant<std::function(void(int)>, 
                    std::function(double(std::string))>> mapunion;

您的标记联合可能包含智能指针,例如一些std::unique_ptr

【讨论】:

    【解决方案2】:

    使用模板你无法做到这一点。

    它是 C++ 中的不同类型。

    与此相关的内容如下: 以任何 stl 容器为例,它们都提供了一个自定义的分配器模板,一个大问题是一个具有不同分配器的容器不能从具有不同分配器类型的同一个容器中分配。

    顺便说一句,因为这个 Bloomberg bd 库只使用虚拟分配器重写了 stl 容器,这没关系,因为它使用动态调度。

    【讨论】:

    • 您必须来自 Java。 C++ 中没有类型擦除。模板是编译类型的概念。除非你的意思是 void*。
    • C++中有类型擦除,例如std::function 擦除函数对象的类型
    猜你喜欢
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    相关资源
    最近更新 更多