在此代码中,我们的目标是创建一个存储具有不同签名的函数的映射,利用字符串作为键并通用方法作为值。
我们利用 std::any 库来实现这一点。通过将函数类型擦除到容器中,我们可以创建一个模板operator()函数来动态调用它们。但是,在调用站点指定精确的参数匹配以避免 std::bad_any_cast 异常至关重要。
考虑以下代码片段:
#include <any> #include <functional> #include <map> #include <string> #include <iostream> using namespace std::literals; template<typename Ret> struct AnyCallable { AnyCallable() {} template<typename F> AnyCallable(F&& fun) : AnyCallable(std::function(std::forward<F>(fun))) {} template<typename ... Args> AnyCallable(std::function<Ret(Args...)> fun) : m_any(fun) {} template<typename ... Args> Ret operator()(Args&& ... args) { return std::invoke(std::any_cast<std::function<Ret(Args...)>>(m_any), std::forward<Args>(args)...); } std::any m_any; }; void foo(int x, int y) { std::cout << "foo" << x << y << std::endl; } void bar(std::string x, int y, int z) { std::cout << "bar" << x << y << z << std::endl; } int main() { std::map<std::string, AnyCallable<void>> map; map["foo"] = &foo; //store the methods in the map map["bar"] = &bar; map["foo"](1, 2); //call them with parameters I get at runtime map["bar"]("Hello, std::string literal"s, 1, 2); try { map["bar"]("Hello, const char *literal", 1, 2); // bad_any_cast } catch (std::bad_any_cast&) { std::cout << "mismatched argument types" << std::endl; } map["bar"].operator()<std::string, int, int>("Hello, const char *literal", 1, 2); // explicit template parameters return 0; }
此代码演示了如何利用类型擦除和模板运算符 () 在映射中存储和调用具有不同签名的函数。
以上是如何使用 C 在映射中存储具有不同签名的函数?的详细内容。更多信息请关注PHP中文网其他相关文章!