簡體   English   中英

如何將各種類型的function指針存儲在一起?

[英]How to store various types of function pointers together?

可以使用通用void*存儲普通指針。 例如

void* arr[10];
arr[0] = pChar;
arr[1] = pINt;
arr[2] = pA;

前一段時間,我遇到了一個討論,即void*可能不足以存儲 function 指針而不會在所有平台(比如 64 位和更多)中丟失數據。 我不確定這個事實。

如果這是真的,那么存儲 function 指針集合的最便攜方式是什么? [注意: 這個問題不能令人滿意地回答這個問題。]

編輯:我將用索引存儲這個 function 指針。 每當訪問此集合時,每個索引都會有一個類型轉換。 到目前為止,我只對制作它的數組或vector感興趣。]

您可以將 function 指針轉換為任何 function 類型的另一個 function 指針並返回而不會丟失。

因此,只要當您通過 function 指針進行調用時,您首先將其類型轉換回正確的類型,您就可以將所有 function 指針存儲在以下內容中:

typedef void (*fcn_ptr)(void);  // 'generic' function pointer

fcn_ptr arr[10];

指向 function 的指針可以通過reinterpret_cast轉換為指向不同類型的 function 的指針。 如果將其轉換回原始類型,則可以保證恢復原始值,以便您可以使用它來調用 function。 (ISO/IEC 14882:2003 5.2.10 [expr.reinterpret.cast] / 6)

您現在只需要 select 任意 function 指針類型為您的數組。 void(*)()是一個常見的選擇。

例如

int main()
{
    int a( int, double );
    void b( const char * );

    void (*array[])() = { reinterpret_cast<void(*)()>(a)
                        , reinterpret_cast<void(*)()>(b) };

    int test = reinterpret_cast< int(*)( int, double) >( array[0] )( 5, 0.5 );
    reinterpret_cast< void(*)( const char* ) >( array[1] )( "Hello, world!" );
}

當然,如果您通過指向不同類型的 function 的指針調用 function,您將失去很多類型安全性,並且您將有未定義的行為

使用您的 function 指針類型的聯合,這適用於 C 和 C++ 並確保指針有足夠的存儲空間(可能仍然是相同的大小)

有幾件事構成了 function 指針的類型。

如果這些功能在您的 function 指針中不一致,那么您就不能明智地將它們存儲在同一個容器中。

但是,您可以將不同的方面綁定std::function中,它是一個可調用的 object,只需要參數簽名和返回類型是統一的。

現在可能是從虛函數的角度重新思考問題的好時機。 function 指針的這種混搭是否具有您可以表達的連貫接口? 如果沒有,那么無論如何你都注定要失敗:-)

RE:Hasturkun,您可以在聯合中存儲異構 function 指針,是的,它們只是 POD,但您還需要存儲有關它是什么類型的指針的信息,以便您可以選擇要調用的正確成員。 這有兩個問題:

  • 每個項目都有開銷,
  • 您必須手動檢查您是否始終始終如一地使用正確的,這是非局部影響的負擔——它是一種傳播毒葯。

每種類型都有一個容器要好得多,它將澄清代碼並使其更安全。 或者,使用諸如std::function之類的代理使它們都具有相同的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM