2013-08-05 69 views
6

我想知道是否有任何方法來檢查您分配到std::function的函數指針是否爲nullptr。我期待!操作員這樣做,但它似乎只有在函數被分配了nullptr_t類型的東西時才起作用。檢查std ::函數是否分配給nullptr

typedef int (* initModuleProc)(int); 

initModuleProc pProc = nullptr; 
std::function<int (int)> m_pInit; 

m_pInit = pProc; 
std::cout << !pProc << std::endl; // True 
std::cout << !m_pInit << std::endl; // False, even though it's clearly assigned a nullptr 
m_pInit = nullptr; 
std::cout << !m_pInit << std::endl; // True 

我寫了這個幫助函數來解決這個問題。

template<typename T> 
void AssignToFunction(std::function<T> &func, T* value) 
{ 
    if (value == nullptr) 
    { 
     func = nullptr; 
    } 
    else 
    { 
     func = value; 
    } 
} 
+0

你的意思是「分配了某種類型的'nullptr_t'」,對吧?當我第一次讀到答案時,我認爲你正在區分初始化和賦值,但是現在我看到了另外一種情況。 –

+2

在示例中,請避免像'__cdecl'和'HWND'這樣的非可移植垃圾,您的問題不依賴於任何特定於Windows的內容,所以沒有理由不使用函數類型,如void()由任何平臺上的任何人測試。 –

+0

我刪除了特定於Windows的部分,並將其更改爲「type nullptr_t」 –

回答

8

這是一個錯誤在你std::function實現(也顯然是在礦),標準說,如果對象是使用空的函數指針構建operator!應返回true,請參閱[func.wrap.func]段8.賦值運算符應該等價於用參數構造一個std::function並交換它,所以operator!在這種情況下也應該返回true。

+0

是不是'顯式操作符bool()'? – dyp

+1

@DyP:'''將上下文轉換爲bool,這會調用顯式操作符。 –

+0

@DyP,我指的是在測試用例中使用的全局'operator!',而不是'std :: function :: operator!'(不存在)。 –

相關問題