繁体   English   中英

C++ 不同函数的数组

[英]C++ Array of different functions

在 Python 中做这样的事情很容易,但在 C++ 中实现它似乎更具挑战性。

我实际上有一些解决方案,但我想看看你是否能看到更好的解决方案。

这就是我想要做的。

我有一个不同类型的值列表(字符串,integer,也可以是一些 class 等的实例)。 现在这是第一个问题——在 C++ 中(与 Python 不同)向量/数组中的所有值都必须是同一类型。

我可以看到的解决方案是我可以像这样使用std::anyvector<std::any> list

我还有一个函数数组/向量(或指向函数的指针),具有不同的参数类型和返回值 - 一个 function 可以接受字符串和 integer 并返回一个 char,另一个可以接受一个 char 并返回一个 int。 这是另一个问题:在 C++ 中,只有当它们具有相同的参数和返回值(据我所知)时,您才能拥有函数的数组/向量,因为在向量声明中您需要定义参数类型和返回值.

另一个问题是我需要为每个 function 检索有关参数和返回值的信息。换句话说,有了这些函数,我需要知道这个 function 接受 2 个字符串和 1 个 integer 并返回一个字符。 在 Python 中,我可以使用 inspect.signature function 来检索有关 function 的类型注释的信息。在 C++ 中,我不知道是否有办法做到这一点。

我在这里看到的解决方案是再次使用 std::any (虽然我将使用其他解决方案,但稍后我会解释原因)。

我可以看到这个问题的解决方案是我不会检索该信息,而是接受此函数向量的 class 的用户只需指定每个 function 的参数类型和返回值。换句话说,我可以看到的解决方案是我不会以编程方式检索有关参数类型的信息。

我遇到的另一个问题是稍后我需要使用一些参数调用其中一个函数。 在 Python 中,我这样做是这样的:

arguments = [1, 'str', some_object] // here I prepare a list of arguments (they are of different types)
func(**arguments)

在 C++ 中我也可以解包,但如果参数类型不同则不行。

我在这里看到的解决方案如下。 vector 中的那些函数都只接受vector<std::any> args ,它只包含所有 arguments。稍后当我想调用 function 时,我将简单地构造一个具有 std::any 值的向量并将其作为参数传递。 这也将解决之前无法存储具有不同参数的函数向量的问题。

你能看到更好的解决方案吗?

你可能想知道我需要这一切是为了什么。 我做了一些程序综合工作,我需要从现有函数中以编程方式构建程序。 我正在编写一个库,我希望我的库的用户能够指定我用来构建程序的那些基本函数。 为了做我想做的事,我需要知道这些函数的参数和返回值是什么,我需要稍后调用它们。

我相信您正在寻找的是std::apply 您可以使用std::tuple而不是std::vector来存储不同类型的值列表——只要这些类型在编译时是已知的。 那么C++中的std::apply(f, t)与Python中的f(*t)基本相同。

我有一个不同类型的值列表(字符串,integer,也可以是一些 class 等的实例)。

作为子类型联合的类型称为总和类型或标记联合 C++ 有模板std::variant

现在这是第一个问题——在 C++ 中(与 Python 不同)向量/数组中的所有值都必须是同一类型。

当然,所以巧妙地使用 C++容器 您可能需要一些std::mapstd::vector的特定实例std::variant

我还有一个函数数组/向量

您可能需要一些std::vector of std::function -s 和带有 C++ lambda 表达式的代码

你应该读一本很好的 C++ 编程书

我正在编写一个库,我希望我的库的用户能够指定我用来构建程序的那些基本函数。

您可以从SWIG中获得灵感,并考虑在您的库中生成一些 C++ 代码。 因此,编写(在 Python 或 C++ 中)您的 C++程序(生成一些 C++ 代码,就像ANTLR所做的那样),它会生成用户代码,并且您的用户会调整他的构建自动化工具来满足这种需要(就像GNU bison的用户那样)。

您还可以考虑在您的应用程序中嵌入Guile (或Lua )。

附言。 您可能对其他编程语言感兴趣,例如OcamlGoScheme (使用Guile并阅读SICP )、 Common Lisp (使用SBCL )或Rust

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM