2016-02-24 7 views
9

वापस करने के लिए कास्ट एसटीडी समारोह वस्तु इस परिदृश्य में:functor struct

struct Holder { 
    std::function<void()> f; 
}; 
struct Functor { void operator()(){ /**/ } }; 
int main() { 
    Holder = { Functor{} }; 
    //... 

वहाँ एक रास्ता करने के लिए बाद में एक Functor प्रकार पर वापस f डाली है?

+0

संक्षिप्त उत्तर है: नहीं। यह सब "प्रकार मिटा" क्या है। –

+3

@SamVarshavchik: थोड़ा लंबा जवाब "हां" है: -एस –

उत्तर

8

target सदस्य फ़ंक्शन std::function की प्रकार-अनारक्षित कलाकार है। आपको लक्ष्य प्रकार जानने की आवश्यकता होगी:

#include <cassert> 
#include <functional> 

struct Functor { void operator()(){ /**/ } }; 

int main() 
{ 
    std::function<void()> f = Functor(); 
    Functor * p = f.target<Functor>(); 
    assert(p != nullptr); 
} 
+0

[डेमो] (https://ideone.com/7HaQ95) –

+0

यह जोर एक अच्छा विचार है, आपको शायद थोड़ा सा हाइलाइट करना चाहिए। AFAIK को लक्ष्य (उदाहरण के लिए) लक्ष्य उदाहरण का स्वामित्व प्राप्त नहीं होता है, क्या आप जानते हैं कि क्या यह std फ़ंक्शन उदाहरण के जीवनकाल के लिए मान्य रहने की गारंटी है? –

+0

@DanielJour: यदि आप फ़ंक्शन ऑब्जेक्ट को पुन: असाइन या स्वैप करते हैं, तो आप निश्चित रूप से आयोजित लक्ष्य खो देंगे। –

संबंधित मुद्दे