2010-11-14 48 views
3

我試圖使用boost::function<x>包裝儲存和轉換我的功能對象,我想知道是否有一個編譯支票「從任意類型T做了轉換輸入boost::function<x>存在」C++函數轉換問題

這裏是一個代碼示例:

struct Functor { 
    int operator()(int) { 
     return 5; 
    } 
}; 

// Should not fire static assertion. 
STATIC_ASSERT((IS_CONVERTIBLE<Functor, 
           boost::function<int (int)> >::value)); 

// Should fire static assertion. 
STATIC_ASSERT((IS_CONVERTIBLE<Functor, 
           boost::function<int (std::string)> >::value)); 

現在 - 沒有一種方法來實現IS_CONVERTIBLE檢查是否存在?


我試圖利用boost::is_convertible型性狀檢查,但它產生true任何Functor類型:

bool value1 = boost::is_convertible<Functor, 
            boost::function<int (int)> >::value; 

bool value2 = boost::is_convertible<Functor, 
            boost::function<int (std::string)> >::value; 

// At this point both 'value1' and 'value2' equal TRUE. 

我也有以下嘗試:

// Here the results are also always TRUE. 
bool value = boost::is_convertible<Functor, 
            boost::function1<int, int> >::value; 

// This doesn't work, because unary functions are constructed via 
// inheritance (the result is always FALSE). 
bool value = boost::is_convertible<Functor, 
            std::unary_function<int, int>::value; 

我真的希望能夠在編譯時檢查這種轉換的可能性,所以 如果有人知道如何實現這一點,我將不勝感激。

謝謝。

回答

1

除了@James寫的東西,你似乎還想擁有類似is_callable的東西。 These class templates處理函數/函數指針和函數對象類或對它們的引用最多5個參數。使用它們需要您自擔風險:)

+0

Who-hoo-hoo,謝謝。這是我正在尋找的適應版本。 – 2010-11-15 00:44:00

1

boost::is_convertible當你測試任何類型是否可轉換爲產生真正的任何boost::function類型,因爲boost::function有一個轉換構造函數模板採用任何類型。

因爲這個轉換構造函數存在,我不知道有一種簡單的方法可以測試一個類型是否爲實際上可轉換爲std::function