gpt4 book ai didi

c++ - 要调用的函数列表。必须有相同的签名。更好的实现?

转载 作者:行者123 更新时间:2023-11-30 02:10:09 25 4
gpt4 key购买 nike

我的程序从文本文件中读取“命令”,例如“w test.txt 5”用于将数字 5 写入 test.txt 或“r test.txt”用于从 test.txt 读取。我没有一个可怕的开关循环来维护我有一个叫做 aFunction 的功能成员

string name;
void (*thefunction)(char *argsIn[], char *out);

所以我有一个字符串名称和一个函数指针。课外我有一个

vector<aFunction> funcVec 

它拥有所有的功能。当我从文本文件中读取命令时,代码会通过 funcVec 查找要调用的正确函数

所以当 funcVec.name = command 读入

(*funcVec[i].theFunction(other values from the text file, output);

例如我可能有函数 read(char *argsIn[], char *out)其中 argsIn 是一个包含 test.txt 的数组,5 和 char out 可能是 1 或 0,具体取决于操作是否成功。

但是我不太喜欢这个,因为现在所有的函数都必须有签名 (char *argsIn[], char *out) 并且函数知道列表中每个参数的含义。

谁能想到更好的实现方式?支持脚本的软件一定要应付这种事情吗?

最佳答案

注意:你最好使用 std::stringstd::vector

Command 模式通常是执行此操作的方法,这允许“打包”对象中的输入/输出参数并呈现“空白”执行方法 void operator()( ) 确保通用接口(interface)。

编辑:命令(通用)的演示。

定义一些命令:

struct Command: boost::noncopyable
{
virtual void do() = 0;
virtual void undo() = 0;
virtual ~Command() {}
};

class SaveFile: public Command
{
public:
explicit SaveFile(FileHandle f, Changes c): _file(file), _changes(c) {}

virtual void do() { _file.apply(_changes); }
virtual void undo() { _file.revert(_changes); }

private:
FileHandle _file;
Changes _changes;
};

class OpenFile: public Command
{
public:
explicit OpenFile(std::string filename): _filename(filename) {}

FileHandle get() const { return _file; }

virtual void do() { _file.load(_filename); }
virtual void undo() { /*nothing to be done*/ }

private:
std::string _filename;
FileHandle _file;
};

两个 Action 堆栈的使用示例:要执行的和已经执行的。

typedef std::stack<std::unique_ptr<Command>> CommandStack;

void transaction(CommandStack& todo)
{
CommandStack undo;
try
{
while(!todo.empty())
{
todo.top()->do();
undo.push(std::move(todo.top()));
todo.pop();
}
}
catch(std::exception const&)
{
while(!undo.empty())
{
undo.top()->do();
undo.pop();
}
}
} // transaction

关于c++ - 要调用的函数列表。必须有相同的签名。更好的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4899907/

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