2014-12-19 80 views
5

我有一個功能foo()正在庫中提供的上下文。該庫定義過載了一把用於此功能,如:如何用通用TR1函數對象包裝多個函數重載?

char foo(float x, int y); 
short foo(double x, char y); 

(I由上面的說法/結果類型向上的外賣是不存在的參數類型和過載的相應之間的通用關係返回類型)。

這個想法是,庫用戶可以根據需要爲其自己的用戶定義類型添加foo()的重載。函數重載很容易完成這一點。

我想使foo()函數系列可用於Boost.Proto表達式。爲了做到這一點,我想我會需要包裝上面的函數對象與模板調用操作:

struct foo_wrap 
{ 
    template <typename A1, typename A2> 
    result_type operator()(A1 a1, A2 a2) { return foo(a1, a2); } 
}; 

問題帶有如何定義result_type。我意識到使用C++ 11和decltype()以及尾隨函數返回類型很容易,但我正在尋找一個C++ 03解決方案。因此,foo_wrap需要是TR1風格的函數對象。我需要找到一種方法來將result_type定義爲參數類型A1A2的編譯時函數。這不僅需要返回類型operator(),而且還需要TR1 result_of協議才能正常工作。總之:

  • 是否有一個元編程技術,給定一個函數名和一組參數類型,將產生函數的相應返回類型?
  • 另外,是否有另一種技術,我可以用一個泛型函數對象包裝多個重載的函數?
+0

便攜性如何,你必須在支持各種編譯器的條款? – cdhowie

+0

我正在尋求支持任何合理的C++ 03兼容編譯器。可能是最低的gcc 4.1左右。我並不特別關心MSVC,但如果它在那裏工作也不錯。 –

+0

如果g ++是您的主要目標,您可能*能夠在這裏使用其專有的'typeof()'功能。 – cdhowie

回答

4

您可以手動送入特徵爲:

template <typename A1, typename A2> 
struct foo_wrap_result; 

struct foo_wrap 
{ 
    template <typename A1, typename A2> 
    typename foo_wrap_result<A1, A2>::type 
    operator()(A1 a1, A2 a2) const { return foo(a1, a2); } 
}; 

和專業化的特質:

template <> 
struct foo_wrap_result<float, int> { typedef char type; }; 

template <> 
struct foo_wrap_result<double, char> { typedef short type; };