2013-10-27 19 views
7

के टेम्पलेट कॉल अगर मैं की तरहC++ समारोह सूचक प्रकार

typedef void (*command)(); 

template <command c> 
void execute() { 
    c(); 
} 

void task() { /* some piece of code */ } 

प्रकार घोषणाओं तो

execute<task>(); 

संकलन होगा और अपेक्षा के अनुरूप व्यवहार करता है। हालांकि अगर मैं टेम्पलेट को

template <command c> 
void execute() { 
    command(); 
} 

यह अभी भी संकलित करता है। मैंने दुर्घटना से ऐसा किया। अब मैं उलझन में हूं कि दूसरे संस्करण की क्या अपेक्षा की जाएगी।

+2

'कमांड();' 'typedef' द्वारा परिभाषित फ़ंक्शन * पॉइंटर * प्रकार का अस्थायी ऑब्जेक्ट बनाता है। – Nawaz

+2

'execute (कमांड) 'कॉल करने में कुछ गलत है ?? आप ऐसे हाइब्रिड पैटर्न का उपयोग क्यों करना चाहते हैं? –

+0

यह एक अलग उदाहरण है। मैंने वास्तव में क्या किया है: http://stackoverflow.com/a/19611077/2036917 बिंदु यह है कि टेम्पलेट मुझे स्थैतिक चर के विभिन्न उदाहरणों की अनुमति देता है। मुझे पता है कि मैं उपयुक्त वस्तुओं के साथ इसे प्राप्त कर सकता हूं। लेकिन फिर याद रखें कि एक Arduino में केवल 2K रैम है। तो इस प्रकार दृष्टिकोण स्मृति पदचिह्न को थोड़ा कम कर देता है। –

उत्तर

8

सी ++

type_name() 

में एक अभिव्यक्ति है कि type_name की डिफ़ॉल्ट-प्रारंभ उदाहरण बनाता है।

मूल निवासी प्रकार के लिए वहाँ परोक्ष डिफ़ॉल्ट कंस्ट्रक्टर्स परिभाषित कर रहे हैं, तो

int(); 

उदाहरण के लिए एक वैध सी ++ बयान है (सिर्फ एक int बनाता है और इसे दूर फेंक)।

g++ पूरी चेतावनी के साथ एक नैदानिक ​​संदेश उत्सर्जित करता है क्योंकि यह एक संदिग्ध (संभवतः अनपेक्षित) ऑपरेशन है, लेकिन कोड मान्य है और इसके आधार पर प्रोग्राम भी हो सकते हैं (यदि प्रकार उपयोगकर्ता द्वारा परिभाषित प्रकार और कन्स्ट्रक्टर है उदाहरण के दुष्प्रभाव हैं)।

+1

यह सही लगता है: 'कमांड temp = command();' लिखने 'और' temp' को मानता है ' – memo1288

+1

@ memo1288: हाँ ... और देशी प्रकारों के लिए यह' कमांड temp 'से भिन्न है; (वह नहीं करता है' टी बहुत सही है) – 6502

4
command(); 

यह TYPE(); की तरह एक अस्थायी वस्तु बनाता है और संकलक एक अप्रयुक्त चर के रूप में यह अस्वीकार करते हैं।

warning: statement has no effect [-Wunused-value] 
    command(); 
    ^

आप -Wall संकलक के विकल्प को चालू करना चाहिए। Live code.

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