gpt4 book ai didi

c++ - 动态推断函数的返回类型

转载 作者:太空狗 更新时间:2023-10-29 19:56:36 26 4
gpt4 key购买 nike

我定义了一些函数,它们的返回类型为 void、int、float、float* 等(还有一些类)。

我的 cmd 是用户输入的字符串 vector 。其中第 0 个位置是函数名称(read_lib、square、open_file),第 1 个位置是参数(/path/to/file、number_to_square)等。

auto find_and_execute(vector<string> cmd){
//for(auto x: cmd){cout << x << endl;}
if(cmd.at(0) == "square") {return square(stoi(cmd.at(1)));} // unsigned_int
if(cmd.at(0) == "cube") {return cube(stoi(cmd.at(1)));} // unsigned_int
if(cmd.at(0) == "open_file") {open_file(cmd.at(1));} //void
if(cmd.at(0) == "read_lib") {read_lib(cmd.at(1));} //void
if(cmd.at(0) == "read_verilog") {read_verilog(cmd.at(1));} //void
if(cmd.at(0) == "set_top") {set_top(cmd.at(1));} //void
if(cmd.at(0) == "get_pin") {return get_pin(cmd.at(1));} // Pin Class object takes in cell argument
}

错误:“auto”的推导不一致:“unsigned int”然后是“Pin”

编辑:我还有一个问题。我的所有函数都不接受字符串输入作为参数。我可以将字符串转换为整数,但如何将其转换为某些类对象,如 Pin/Cell

最佳答案

函数的返回类型必须能够在编译时确定。 C++ 是一种静态类型语言。 auto 并不意味着“可以是任何东西”,它意味着“将在编译时推导”。

如果您有一个可能需要返回多种类型的函数,您需要使用 std::variant(在 C++17 中)或 boost::variant(C++17 之前,但需要使用 Boost 库)。

具体在您的情况下,由于您的某些调用可能不返回任何内容(如 void 所界定),将此变体放在 optional 中也可能很好(也是 C++17,或者 boost::optional 如果是 C++17 之前的版本):

using return_t = std::optional<std::variant<unsigned int, Class>>;

return_t find_and_execute(std::vector<std::string> const& cmd) {
if(cmd.at(0) == "square") {return square(stoi(cmd.at(1)));} // unsigned_int
if(cmd.at(0) == "cube") {return cube(stoi(cmd.at(1)));} // unsigned_int
if(cmd.at(0) == "open_file") {open_file(cmd.at(1)); return {};} //void
if(cmd.at(0) == "read_lib") {read_lib(cmd.at(1)); return {};} //void
if(cmd.at(0) == "read_verilog") {read_verilog(cmd.at(1)); return {};} //void
if(cmd.at(0) == "set_top") {set_top(cmd.at(1)); return {};} //void
if(cmd.at(0) == "get_pin") {return get_pin(cmd.at(1));} // Class object
}

return_t result = find_and_execute({std::string("square"), std::string("13")});
if(result) {//Should always be true
try {
unsigned int & value = std::get<unsigned int>(*result);
} catch (std::bad_variant_access const&) {}
}

result = find_and_execute({std::string("open_file"), std::string("File.txt")});
if(!result) {//Should always be true
/*...*/
}

result = find_and_execute({std::string("get_pin"), std::string("EAX")});
if(result) {//Should always be true
try {
Class & value = std::get<Class>(*result);
} catch (std::bad_variant_access const&) {}
}

编辑:

另一个版本,正如@chris 所建议的那样,使用 std::monostate 来避免使用 std::optional。根据具体情况,这可能是更适合您的界面。

using return_t = std::variant<std::monostate, unsigned int, Class>;

return_t find_and_execute(std::vector<std::string> const& cmd) {
if(cmd.at(0) == "square") {return square(stoi(cmd.at(1)));} // unsigned_int
if(cmd.at(0) == "cube") {return cube(stoi(cmd.at(1)));} // unsigned_int
if(cmd.at(0) == "open_file") {open_file(cmd.at(1)); return {};} //void
if(cmd.at(0) == "read_lib") {read_lib(cmd.at(1)); return {};} //void
if(cmd.at(0) == "read_verilog") {read_verilog(cmd.at(1)); return {};} //void
if(cmd.at(0) == "set_top") {set_top(cmd.at(1)); return {};} //void
if(cmd.at(0) == "get_pin") {return get_pin(cmd.at(1));} // Class object
}

return_t result = find_and_execute({std::string("square"), std::string("13")});
try {
unsigned int & value = std::get<unsigned int>(result);
} catch (std::bad_variant_access const&) {}

result = find_and_execute({std::string("open_file"), std::string("File.txt")});
//Could query for it if you really needed to
//try {
//std::monostate & value = std::get<std::monostate>(result);
//} catch (std::bad_variant_access const&) {}

result = find_and_execute({std::string("get_pin"), std::string("EAX")});
try {
Class & value = std::get<Class>(*result);
} catch (std::bad_variant_access const&) {}

关于c++ - 动态推断函数的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46348565/

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