包含 std::function<T()> 和 std::function<T(int)的映射>
map containing std::function<T()> and std::function<T(int)>
我想有一个单一的映射映射字符串键到std::function<T()>
或std::function<T(int)>
(但不是两个给定的键)。我得到一个编译错误,似乎没有一个模板的std::function<T(...)>
。我希望能够使用lambdas作为值。
一种替代方法是将虚值函数包装在包装器lambda中,该包装器lambda接受一个参数,不处理它,只调用包装的函数。那么,映射中的所有内容都是一元函数。
当然,如果你在检索时知道函数的类型(我猜你必须知道,否则它是无用的!),那么为什么不使用两个映射呢?
试试boost::variant
?
std::map<std::string, boost::variant<std::function<T()>, std::function<T(int)> > >
无论如何,这似乎是一个XY问题。到底是什么你想做的?
空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";
}
有两个映射,不同的是访问get<0>
或get<1>
。这样做的好处是,如果要在模板中选择访问哪一个,它可以静态地选择0或1,并使用通用代码。如果你不需要这个,只需要两个std::map
。
boost::variant
也可以(映射到0或1函数的variant
)。您还可以使用c++ 11的union
(注意,它将没有默认构造函数,或复制构造函数,除非您提供一个)在struct
中使用enum(复制union
)——基本上是一个贫民窟的boost::variant
。
相关文章:
- "error: no matching function for call to"构造函数错误
- 调用专用模板时出错"no matching function for call to [...]"
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- Confusion: decltype vs std::function
- 为什么 std::function 可以作为 std::not2 的参数?
- 'max'匹配'std::function<const int &(const int &, const int &)>'无过载
- 传递给std::function template的template参数究竟代表什么
- EASTL矢量<向量<int>>连续的
- 将带有unique_ptr的可变 lambda 传递给 const&std::function
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- "no matching function for call to 'Vector::Vector'"错误
- 如何在向量中删除 std::function<void()>?
- 不断"Attempting to reference a deleted function"
- 将函数包装器转换为 std::function
- 类型擦除的std::function与虚拟函数调用的开销
- C++ std::function 对于类 exept 的所有实例都是空的(只有 Visual2019 编译器问题)
- 如果模板没有可变参数,则 Lambda 被推导出为 std::function
- 我在 ifstream input_file(文件名)行中收到错误"no matching function to call";
- 模板规范获取'Ambiguous call to overloaded function'
- 将 lambda 表达式传递给 std::function in C++