空std::function
的没那么重。您可以只映射到一个包含每个结构的结构。你知道哪个是有效的,所以只能访问那个。
如果您有模板代码需要统一操作而不作为参数传入:
#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";
}
这有两个映射,不同的是访问 aget<0>
或 a get<1>
。这样做的好处是,如果您选择在模板中访问两者中的哪一个,它可以静态选择 0 或 1 并使用通用代码。如果你不需要这个,只要有两个std::map
s。
Aboost::variant
也有效(映射到variant
0ary 或 1ary 函数的 a)。您还可以在带有枚举(复制)的 a 中使用 C++11 union
(注意它没有默认构造函数或复制构造函数,除非您提供一个) - 基本上是一个 ghetto 。struct
union
boost::variant