2010-02-25 19 views
17

मुझे एक ऐसा फ़ंक्शन मिला है जो मैं एक त्रुटि शर्त रिपोर्ट करने के लिए कॉलबैक के रूप में वैकल्पिक बूस्ट :: फ़ंक्शन तर्क लेना चाहता हूं। क्या कोई विशेष मूल्य है जिसे मैं वैकल्पिक बनाने के लिए डिफ़ॉल्ट मान का उपयोग कर सकता हूं?बढ़ावा :: फ़ंक्शन तर्क के लिए डिफ़ॉल्ट मान?

उदाहरण के लिए

, एक नियमित रूप से समारोह सूचक मैं क्या कर सकते हैं साथ:

void my_func(int a, int b, t_func_ptr err_callback=NULL) { 

    if (error && (err_callback != NULL)) 
     err_callback(); 

} 

मैं बढ़ावा :: समारोह समारोह सूचक की जगह के साथ कुछ ऐसा ही कर सकता हूँ?

उत्तर

21

आप बूस्ट :: फ़ंक्शन तर्क के डिफ़ॉल्ट मान के लिए 0 (C++ के NULL के बराबर) का उपयोग कर सकते हैं, जिसके परिणामस्वरूप एक खाली फ़ंक्शन ऑब्जेक्ट होगा। आप परीक्षण कर सकते हैं, तो यह अपने empty() विधि बुला 0 से तुलना, या बस एक बूलियन संदर्भ में उपयोग करके खाली है:

void my_func(int a, int b, boost::function<void()> err_callback = 0) { 
    if (error && err_callback) // tests err_callback by converting to bool 
     err_callback(); 
} 

boost::function वस्तुओं इस संबंध में सादे समारोह संकेत की तरह काफी काम करते हैं।

+2

बिल्कुल सही, नहीं सोचा था कि यह इतना आसान है, धन्यवाद होगी! –

11

एक अच्छा विशेष मूल्य डिफ़ॉल्ट-निर्मित boost::function हो सकता है।

एक खाली function एक बुलियन संदर्भ (जैसे एक पूर्ण सूचक) में झूठा मूल्यांकन करता है, या आप empty() विधि का उपयोग यह जांचने के लिए कर सकते हैं कि फ़ंक्शन ऑब्जेक्ट रैपर में वास्तव में कोई फ़ंक्शन शामिल है या नहीं। boost::function Tutorial देखें।

यहाँ एक कोड नमूना है:

#include <boost/function.hpp> 
#include <iostream> 

typedef boost::function<void (int code)> t_err_callback; 

void do_callback(int code) 
{ 
    std::cout << "Error " << code << std::endl; 
} 

void my_func(int a, int b, t_err_callback err_callback=t_err_callback()) 
{ 
    bool error = true; // An error happened 
    int error_code = 15; // Error code 
    if (error && !err_callback.empty()) 
     err_callback(error_code); 
} 

int main() 
{ 
    my_func(0, 0); 
    my_func(0, 0, do_callback); 
} 
+1

मुझे इसे ऊपर उठाना है, क्योंकि यह मेरे कोड का परीक्षण करने के लिए उपयोग किया गया एक ही कोड है। :) – efotinis

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