2016-06-13 40 views
0

假設我有一個類bar與方法foo的多種實現:獲取參數類型的所有函數的重載

struct bar { 
    void foo(int, int); 
    void foo(float, bool); 
    void foo(const vector<void*>&); 
} 

有我一個可能獲得的參數類型列表列表?換句話說,我定義了

template<typename... types> class list {}; 

並且想要獲得list<list<int, int>, list<float, bool>, list<const vector<void*>&>>

+1

啊,神祕的'invocation_traits'建議... –

+0

@KerrekSB,聽起來不太舒服... –

+0

你期待什麼樣的界面?就像提供'bar'並得到'list'?那麼,.... – Arunmu

回答

2

你可以問 「我可以叫bar.foo與ARGS int, long?」。你可以問這個問題:「是否有?的&Bar::foo方法?」,但是兩者都不符合你的要求。

你可以做的另一件事是完全向前bar.foo,甚至做SFINAE測試這樣的故障在出現故障的轉發接口轉發的結果,而不是它的實現中。

如果您有一個有限的類型列表和最大精算數,您可以在O(T^N)成本下徹底搜索那些工作的重載集合或精確的簽名匹配。

作爲一個社論,你的問題有這種類型的問題的常見缺陷,你描述一個特定的技術挑戰,甚至無法隨便描述這個挑戰打算解決的問題。實際上,「我想反映功能簽名超負荷」問題的可靠性令人震驚,永遠不會自願提供他們的反思意圖修復的特定問題。很多很多這樣的問題都有解決方案,不需要全面反思來解決。

+0

是的,謝謝,我想現在就考慮問一個關於我的特殊問題的問題。但硬幣的另一面:我的特殊問題太專業化了,以致於無法提出問題(我甚至不能提供足夠短的標題),它看起來很像「請爲我寫代碼」。 –

+0

@TigranSaluev我發現最好的描述是什麼阻止了你沿着你的修復路徑*和*至少一個模糊的描述,你爲什麼試圖做你想做的事情是有效的。 – Yakk