2013-08-05 15 views
6

atanırsa kontrol ediliyor. Bunu yapmak için ! -operator bekliyordum, ancak işlev nullptr_t türünde bir şey atandığında çalışır gibi görünüyor. bir <code>std::function</code> içine atanmış işlev işaretçisi bir <code>nullptr</code> olup olmadığını kontrol için herhangi bir yolu varsa bir std :: işlevi merak ediyorum bir 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 

şimdilik bu geçici bir çözüm için bu yardımcı fonksiyon yazdım. (Görünüşte madende de ve) senin std::function uygulamasında bir hata var

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

Haklısınız, "tip' nullptr_t' atanan bir şey" ne demek? Cevapları ilk okuduğumda, başlatma ve atama arasında bir ayrım yaptığınızı sanıyordum, ama şimdi başka türlü görüyorum. –

+2

__cdecl' 'gibi taşınabilir olmayan bok kaçının ve' HWND' örneklerde, sorunuz şey Windows'a özgü dayanmaz, bu nedenle bu tür boşluğu 'gibi bir işlev türünü kullanmak için hiçbir neden yoktur()' o olabilir herhangi bir platformda herkes tarafından test edildi. –

+0

Windows özgü parçaları kaldırıldı ve "nullptr_t tip" olarak değiştirin –

cevap

8

, standart operator! nesne boş işlev işaretçisi ile inşa edilirse, return true [func.wrap.func] paragraf göreceğimiz söylüyor 8. Atama operatörü, bir argüman ile bir std::function oluşturmaya eşdeğer olmalıdır ve bu nedenle, bu durumda operator! da doğru olarak döndürülmelidir.

+0

bir 'açık operatör bool()' değil midir? – dyp

+1

@DyP: Ve '!', Açık operatörü çağıran boole bağlamsal dönüşüme neden olur. –

+0

@DyP, ben küresel 'operatörü atıfta bulundu!' Testcase değil, 'std :: fonksiyon :: operatör içinde kullanılan o!' (Yok ki.) –

İlgili konular