在Python中做这样的事情很容易,但在C++中实现它似乎更具挑战性。
事实上,我有一些解决方案,但我想看看你是否能找到更好的解决方案。
这是我想做的。
我有一个不同类型的值列表(字符串、整数,也可以是某个类的实例等)。现在是第一个问题-在C++中(与Python不同),矢量/数组中的所有值都必须是相同的类型。
我能看到的解决方案是,我可以像这样使用std::any
:vector<std::any> list
。
我还有一个函数数组/向量(或指向函数的指针),它们具有不同的参数类型和返回值——一个函数可以接受字符串和整数并返回char,另一个函数则可以接受char并返回int。这里还有另一个问题:在C++中,只有当函数具有相同的参数和返回值时(据我所知),你才能拥有函数的数组/向量,因为在向量的声明中,你需要定义参数类型和返回值。
另一个问题是,我需要检索关于每个函数的参数和返回值的信息。换句话说,有了这些函数,我需要知道这个函数接受2个字符串和1个整数,并返回一个char。在Python中,我可以使用inspect.signature函数来检索有关函数的类型注释的信息。在C++中,我不知道是否有办法做到这一点。
我在这里看到的解决方案是再次使用std::any(虽然我会使用另一个解决方案,但稍后我会解释原因)。
我能看到的这个问题的解决方案是,我不会检索这些信息,而是接受这个函数向量的类的用户只需指定每个函数的参数类型和返回值。换句话说,我可以看到的解决方案是,我不会以编程方式检索有关参数类型的信息。
我遇到的另一个问题是,以后我需要用一些参数调用其中一个函数。在Python中,我这样做:
arguments = [1, 'str', some_object] // here I prepare a list of arguments (they are of different types)
func(**arguments)
在C++中,我也可以进行解包,但如果参数是不同类型的,则不能。
我在这里看到的解决方案如下。向量中的那些函数都将只接受参数vector<std::any> args
,该参数将简单地包含所有参数。稍后,当我想调用该函数时,我将简单地用std::any值构造一个向量,并将其作为参数传递。这也将解决以前不能存储具有不同参数的函数的向量的问题。
你能看到更好的解决方案吗?
你可能想知道我需要这些是为了什么。我做了一些程序合成的工作,我需要从现有的函数中以编程的方式构建程序。我正在编写一个库,我希望我的库的用户能够指定我构建程序所使用的基本函数。为了做我想做的事情,我需要知道这些函数的参数和返回值是什么,我需要稍后调用它们。
我相信您正在寻找的是std::apply
。您可以使用std::tuple
而不是std::vector
来存储不同类型的值的列表——只要这些类型在编译时是已知的。那么C++中的std::apply(f, t)
与Python中的f(*t)
基本相同。
我有一个不同类型的值列表(字符串、整数,也可以是某个类的实例等)
作为子类型并集的类型称为和类型或标记并集。C++有一个模板std::variant
。
现在是第一个问题-在C++中(与Python不同),矢量/数组中的所有值都必须是相同的类型。
当然,所以要巧妙地使用C++容器。您可能需要std::variant
的特定实例的std::map或std::vector。
我还有一个函数的数组/向量
您可能想要一些std::function
-s的std::vector
和带有C++lambda表达式的代码
你应该读一本好的C++编程书
我正在编写一个库,我希望库的用户能够指定我构建程序所使用的基本函数。
您可以从SWIG中获得灵感,并考虑在库中生成一些C++代码。因此,(用Python或C++)编写生成用户代码的C++元程序(生成一些C++代码,就像ANTLR一样),您的用户会根据这种需要调整他的构建自动化工具(就像GNU bison的用户一样)。
您还可以考虑在应用程序中嵌入Guile(或Lua)。
PS。您可能对其他编程语言感兴趣,如Ocaml、Go、Scheme(带Guile和read SICP)、Common Lisp(带SBCL)或Rust。