簡體   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