C++ 包含std::function和std::function

C++ 包含std::function和std::function,c++,map,c++11,stdmap,std-function,C++,Map,C++11,Stdmap,Std Function,我希望有一个单独的映射,将字符串键映射到std::function或std::function,但对于给定的键,不能同时映射两者。我得到一个编译错误,似乎没有std::function的模板。我希望能够使用lambdas作为值 首先,这样存储函数安全吗?第二,如果是,语法是什么?从映射中检索函数时,将知道该函数是一元函数还是空函数。如果以上都没有,那么什么才是合理的选择呢?指针扼杀了lambda的想法,对吧 C++11还可以。另一种方法是将空函数包装在一个包装lambda中,该包装lambda接

我希望有一个单独的映射,将字符串键映射到std::function或std::function,但对于给定的键,不能同时映射两者。我得到一个编译错误,似乎没有std::function的模板。我希望能够使用lambdas作为值

首先,这样存储函数安全吗?第二,如果是,语法是什么?从映射中检索函数时,将知道该函数是一元函数还是空函数。如果以上都没有,那么什么才是合理的选择呢?指针扼杀了lambda的想法,对吧


C++11还可以。

另一种方法是将空函数包装在一个包装lambda中,该包装lambda接受一个参数,不做任何操作,只调用包装函数。那么地图上的所有东西都是一元函数

当然,如果你在检索时知道函数的类型,我想你必须知道,否则它就没用了!,那么为什么不使用两个映射呢?

也许可以试试boost::variant

不管怎么说,这看起来像是一场灾难。您到底想做什么?

空std::函数没有那么重。您可以只映射到一个包含其中一个的结构。你知道哪个是有效的,所以只能访问那个

如果您的模板代码需要在两个模板上统一操作,而不作为参数传入:

#include <string>
#include <functional>
#include <map>
#include <tuple>
#include <iostream>
#include <math.h>

template<typename T>
using my_maps = std::tuple< std::map<std::string, std::function<T()>>, std::map<std::string, std::function<T(int)>>>;


int main() {
  my_maps<double> maps;
  std::get<0>(maps)["pi"] = [](){ return 3.14; };
  std::get<1>(maps)["e^"] = [](int x){ return pow( 2.7, x ); };
  std::cout << std::get<1>(maps)["e^"](2) << "\n";
  std::cout << std::get<0>(maps)["pi"]() << "\n";
}
这有两个映射,不同的是访问权限是get还是get。这样做的好处是,如果您选择在模板中访问这两个选项中的哪一个,它可以静态地选择0或1,并使用公共代码。如果您不需要这个,只需要两个std::maps


一个boost::variant也可以映射到0ary或1ary函数的变体。您还可以使用C++11联合体,注意它将没有默认构造函数或复制构造函数,除非您在结构中提供一个带有枚举的联合体副本,它基本上是一个ghetto boost::variant。

@OliCharlesworth,这是一种解决方法!在某种程度上,我希望能够隐藏它,例如,类上只有一个带有map的get方法。但我肯定可以解决这个问题。为什么不只用两个容器呢?由于您必须执行一些检查,以便知道如何调用该函数,因此您最好通过分离两种类型的函数来执行检查。我想要一个工厂模式,其中stamper对象对象创建者为空或一元,映射由问题域中的类名或等效名称进行键控。在创建最终对象之前,我可以对一元对象使用std::bind将它们转换为空值。
#include <string>
#include <functional>
#include <map>
#include <tuple>
#include <iostream>
#include <math.h>

template<typename T>
using my_maps = std::tuple< std::map<std::string, std::function<T()>>, std::map<std::string, std::function<T(int)>>>;


int main() {
  my_maps<double> maps;
  std::get<0>(maps)["pi"] = [](){ return 3.14; };
  std::get<1>(maps)["e^"] = [](int x){ return pow( 2.7, x ); };
  std::cout << std::get<1>(maps)["e^"](2) << "\n";
  std::cout << std::get<0>(maps)["pi"]() << "\n";
}