在Python语言中做类似的事情很容易,但在C++中实现它似乎更具挑战性。
我实际上有一些解决方案,但我想看看你是否能找到更好的解决方案。
这就是我想要做的。
我有一个不同类型的值的列表(字符串,整数,也可以是某个类的实例等)。现在是第一个问题--在C++中(不像在Python中),向量/数组中的所有值都必须是相同类型的。
我能看到的解决方案是,我可以像这样使用std::any
:vector<std::any> list
。
我还有一个函数数组/向量(或指向函数的指针),它们具有不同的参数类型和返回值--一个函数可以接受字符串和整数并返回一个字符,另一个函数可以接受一个字符并返回一个int。这里还有另一个问题:在C++中,只有当函数的数组/向量具有相同的参数和返回值时(据我所知),才能有一个数组/向量,因为在向量的声明中,您需要定义参数类型和返回值。
另一个问题是,我需要检索有关每个函数的参数和返回值的信息。换句话说,有了这些函数,我需要知道这个函数接受2个字符串和1个整数,并返回一个字符。在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::任何值的向量,并将其作为参数传递。这也解决了之前不能存储具有不同参数的函数的向量的问题。
你能找到更好的解决方案吗?
你可能想知道我需要这一切是为了什么。我做一些程序合成的工作,我需要从现有的函数以编程方式构造程序。我正在编写一个库,我希望我的库的用户能够指定那些我用来构造程序的基本函数。为了做我想做的事情,我需要知道这些函数的参数和返回值是什么,并且我需要稍后调用它们。
发布于 2020-08-06 16:52:33
我相信你要找的是std::apply
。您可以使用std::tuple
代替std::vector
来存储不同类型的值的列表--只要这些类型在编译时是已知的。那么C++中的std::apply(f, t)
与Python中的f(*t)
基本相同。
发布于 2020-08-06 17:02:34
我有一个不同类型的值的列表(字符串,整数,也可以是某个类的实例等)。
并行子类型的类型称为sum类型或tagged union。C++有这方面的template std::variant
。
这里是第一个问题--在C++中(不像在
中),向量/数组中的所有值都必须是相同类型的。
当然,所以要聪明地使用C++ containers。您可能需要特定std::variant
实例的一些std::map或std::vector。
I也有一个函数数组/向量
您可能需要一些std::function
-s的std::vector
和C++ lambda expressions的代码
你应该阅读一个good C++ programming book
我正在写一个库,我希望我的库的用户能够指定那些基本函数,我用这些函数来构造程序。
您可以从SWIG中获得灵感,并考虑在您的库中生成一些C++代码。因此,(用Python或C++)编写您的C++ metaprogram (生成一些C++代码,就像ANTLR一样)来生成用户代码,这样您的用户就会根据这种需要调整他的build automation工具(就像GNU bison的用户一样)。
PS。您可能对其他编程语言感兴趣,比如Ocaml、Go、Scheme (带有Guile和read SICP)、Common Lisp (带有SBCL)或Rust。
https://stackoverflow.com/questions/63216508
复制相似问题