簡體   English   中英

用boost :: variant指向成員函數的指針

[英]pointers to member functions with boost::variant

我試圖定義一個指向成員函數的“通用”指針,該指針可用於訪問特定類中的各種成員函數,如下所示:

class Security{
    inline std::vector<double> member_function(const std::string &input_data_string){ return ... a vector<double>....;};
    };

我正在定義一個指向成員函數的通用指針,該成員函數可通過使用boost :: variant來訪問“ OTHER”函數以及具有不同的返回類型和不同的類型參數。

typedef boost::variant<std::string,double, std::vector<double>, std::vector<std::string>>  (Security::*ptr_sec_fn)(boost::variant<std::string,double, std::vector<double>, std::vector<std::string>> );

然后將指針分配給成員函數

    ptr_sec_fn=&Security::member_function;

這是我得到的錯誤:

cannot convert from 'std::vector<_Ty> (__thiscall Security::* )(const std::string &)' to 'boost::variant<T0_,T1,T2,T3> (__thiscall Security::* )(boost::variant<T0_,T1,T2,T3>)'
1>          with
1>          [
1>              _Ty=double
1>          ]
1>          and
1>          [
1>              T0_=std::string,
1>              T1=double,
1>              T2=std::vector<double>,
1>              T3=std::vector<std::string>
1>          ]
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

您能幫我確定我在做什么錯嗎? 非常感謝。

這樣無法正常工作。 有人必須執行從向量到變量類型的轉換,而您的函數無法做到(因為它返回向量,這就是它所知道的全部),並且創建指針的代碼也無法做到這一點(因為它無法即時創建函數)。

另一方面,您可能仍要重新考慮您的設計。 為什么仍然需要這樣的泛型函數指針? 是否可以更具體地指定? 一個好的設計通過清晰的類型來展示自己,因為與任何文檔相比,這些類型可以更准確地向程序員顯示所需的數據。

Security::member_function的類型為std::vector<Ty> (_thiscall Security::* )(const std::string &) ,與您嘗試為其分配指針的類型完全不同。 這是不允許的。 您只能將采用該變量並將其返回的成員函數分配給該類型的成員函數指針。

如果此分配有效,則嘗試調用成員函數指針的代碼將向該函數傳遞一個變體,並且該函數將被破壞,因為它需要一個字符串。 在任何地方都沒有足夠的信息讓所有人知道有人需要以某種方式從您的變體中獲取字符串。 即使所有工作都奏效,當函數返回向量時,也需要有人知道該向量需要用於構造變體。 那必須在呼叫站點完成,但是呼叫站點甚至都不知道返回了引導程序。 您知道返回的類型還不夠,編譯器必須知道。 而且您知道類型的事實表明,您一開始就不應該使用全部使用的類型。 您應該只使用正確的類型。

如果您有一堆采用不同類型並返回不同類型的重載函數,那么您將無法擁有一個可以指向任何這些重載的成員函數指針。 嘗試完全忽略C ++中的類型安全性。 因此,您必須考慮一種類型安全的方法來執行所需的操作。

我們需要有關您的目標是什么的更多信息,以幫助您找到一種實現方法,但是您目前正在嘗試的方法永遠無法奏效。

暫無
暫無

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

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