gpt4 book ai didi

c++ - 从 std::map 调用函数

转载 作者:行者123 更新时间:2023-11-28 00:00:49 27 4
gpt4 key购买 nike

我正在尝试构造将用作我的函数的处理程序的 Object。为了解释原因,我将使用它来扫描用户输入,检查 map 是否匹配。如果找到匹配项,我将调用该函数并将 user-inputted 行的其余部分复制到该函数;

class Object
{
public:
Object(std::map<std::string, void(*)(const std::string&)> MAP)
{/*...code...*/};
};

快速示例代码:

class Main
{
public:
void testFunc(const std::string& A)
{

}

void construct()
{
Object{
std::map<std::string, void(*)(const std::string&)> {
{"exit", [](const std::string &A){ exit(1); }},
//{"test1", (void(Main::*)(const std::string&))&testFunc},
//{"test2", [](const std::string &A){ testFunc(A); }},
//{"test3", [this](const std::string &A){ testFunc(A); }},
{"NULL", NULL}
}
};
}
};

注释行都没有工作,产生了不同的错误,但其他行成功了并且没有运行时错误(好吧,NULL 应该是,但我正在处理它)。

我的问题是,我是否正确地想象了它的机制,如果没有,我是否应该只保存指针并稍后转换为函数?是否可以在仅在类范围内定义的对象中保存引用和调用函数(也可以从类内部进行调用)?

很多问题.. 我知道。但我以前从未见过这样做的......所以我想这可能是有充分理由的。

因为我没有指定错误,here is a link ;

最佳答案

static成员函数与非成员函数的不同之处在于它们采用额外的隐式参数 - 类实例。 Main::testFunc需要两个参数:a Main和一个 std::string const& .但是您的界面只允许一个参数。完成这项工作的唯一方法是创建一个全局 Main*该函数将引用 - 这是一个非常脆弱的设计。

相反,您可以使用 std::function<void(std::string const&)> 使您的界面更加通用.这是接受 std::string const&任何可调用对象,而不仅仅是指向函数的指针。这将允许您编写最后一个版本:

{"test3", [this](const std::string &A){ testFunc(A); }},

这可能是您最好的选择。

关于c++ - 从 std::map 调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39111749/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com