2011-12-07 25 views
0

我米試圖定義一個「通用」指針,它指向可以用於一個特定的類內訪問各種部件的功能如下的成員函數:指針成員函數與升壓::變體

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 

能否請你幫我鑑定我在做什麼這裏錯了嗎?非常感謝。

+1

您是否考慮過使用'boost :: function'或'std :: function'來代替? – AJG85

+0

也看'boost :: bind'和'boost :: phoenix :: bind' – Smash

回答

0

這不能這樣工作。有人必須從矢量到變體類型進行轉換,並且你的函數不能做到這一點(因爲它返回一個矢量,而這就是它所知道的),創建指針的代碼也不能做到這一點(因爲它不能立即創建一個功能)。

另一方面,您可能要重新考慮您的設計。爲什麼你需要一個這樣的通用函數指針呢?可以更具體地指定它嗎?一個好的設計通過清晰的類型顯示出來,因爲類型向程序員顯示比任何文檔所要求的更精確的數據。

+0

我這樣做是因爲我不想重新定義指針,每次我想調用不同的memeber函數,儘管每次我都會調用函數我知道它的返回類型。我怎麼能做轉換,如果我要通過像這樣的指針調用函數:ptr_sec_fn =&(boost :: get > Security :: member_function)..不知道這是否是一個有效的語法! –

0

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

如果此賦值工作,那麼試圖調用您的成員函數指針的代碼會將一個變體傳遞給該函數,並且函數將因爲它期望一個字符串而被破壞。沒有足夠的信息可以讓任何人知道某人需要以某種方式從你的變體中獲得一個字符串。即使所有這些都起作用,當函數返回一個向量時,有人需要知道該向量需要用來構造一個變體。這必須在呼叫站點完成,但呼叫站點甚至不知道正在返回一個向量。你知道返回什麼類型是不夠的,編譯器必須知道它。而且你知道這個類型的事實表明你不應該首先使用全部類型。你應該只使用正確的類型。

如果你有一堆接受和返回不同類型的重載函數,你將無法擁有一個指向任何重載的成員函數指針。試圖做到這一點完全忽略了C++中的類型安全性。所以你必須考慮一種安全的方式來做你想做的事。

我們需要更多的信息來說明您的目標是如何幫助您找到解決辦法的方法,但您目前嘗試的方法永遠無法工作。