2013-08-05 24 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!'(不存在)。 –

相关问题