2011-02-23 22 views
18

सी ++ 0x में, कोई एक constexpr std :: tuple बना सकता है, उदा।संकलन समय पर एक constexpr std :: tuple से कैसे पूछें?

#include <tuple> 
constexpr int i = 10; 
constexpr float f = 2.4f; 
constexpr double d = -10.4; 
constexpr std::tuple<int, float, double> tup(i, f, d); 

कोई भी रनटाइम पर std :: tuple से पूछताछ कर सकता है, उदा।

int i2 = std::get<0>(tup); 

लेकिन यह संकलन समय पर यह क्वेरी करने के लिए संभव नहीं है, उदाहरण के लिए, के माध्यम से

constexpr int i2 = std::get<0>(tup); 

एक संकलन त्रुटि (कम से कम नवीनतम जी ++ स्नैपशॉट 2011-02-19) के साथ फेंक देते हैं।

क्या संकलन समय पर constexpr std :: tuple से पूछने का कोई अन्य तरीका है?

और यदि नहीं, तो क्या कोई वैचारिक कारण है कि किसी को इसकी पूछताछ क्यों नहीं की जाती है?

(मैं, std :: टपल, जैसे का उपयोग कर से बचने के बारे में पता कर रहा हूँ बजाय बढ़ावा :: एमपीएल या बढ़ावा देने :: संलयन का उपयोग करके, लेकिन किसी भी तरह यह नए मानक में टपल वर्ग उपयोग करने के लिए नहीं गलत लग रहा है .. ।)।

वैसे, किसी को पता है क्यों

constexpr std::tuple<int, float, double> tup(i, f, d); 

ठीक संकलित, लेकिन

constexpr std::tuple<int, float, double> tup(10, 2.4f, -10.4); 
नहीं

?

बहुत पहले से धन्यवाद! - लार्स

+0

n3225.pdf में, केवल डिफ़ॉल्ट कन्स्ट्रक्टर को constexpr चिह्नित किया जाता है। शायद इस सुविधा का उपयोग करना बहुत जल्दी है? – UncleBens

उत्तर

12

std::getconstexpr चिह्नित नहीं है, तो आप इसे इस्तेमाल नहीं कर सकते एक constexpr संदर्भ में एक tuple से मूल्यों को पुनः प्राप्त करने के लिए, भले ही है कि टपल ही constexpr है।

दुर्भाग्यवश, std::tuple का कार्यान्वयन अपारदर्शी है, इसलिए आप अपने स्वयं के एक्सेसर्स भी नहीं लिख सकते हैं।

+0

धन्यवाद। तो आपका जवाब है "नहीं, यह संभव नहीं है।" मैंने इस बीच देखा और पूरी तरह से सहमत हूं। यह सवाल छोड़ देता है: हम संकलन समय पर std :: tuples क्यों नहीं पूछ सकते हैं? लेकिन evtl. इस सवाल पर व्यापक रूप से चर्चा की गई है [std :: forward] के constexpr पर प्रश्न [http://stackoverflow.com/questions/5098069/why-discards-stdforward-constexpr-ness)। – Lars

+8

[एन 3305] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3305.html) 'tuple :: get' के लिए constexpr जोड़ने का प्रस्ताव –

-2

मैंने अभी तक सी ++ 0x के साथ काम नहीं किया है, लेकिन ऐसा लगता है कि std :: get() एक फ़ंक्शन है, अभिव्यक्ति के बजाय संकलक सीधे व्याख्या कर सकता है। इस तरह, फ़ंक्शन को संकलित करने के बाद, रनटाइम को छोड़कर इसका कोई अर्थ नहीं है।

+1

सी ++ 0x कीवर्ड 'constexpr' जोड़ता है जो वास्तव में कंपाइलर को संकलन समय पर किसी फ़ंक्शन का मूल्यांकन करने के लिए मजबूर करता है, यानी' constexpr int add (int x, int y) {return x + y;} 'के साथ आप' constexpr 'कह सकते हैं int i = add (7, 13); 'और मेरा मान संकलन समय पर उपलब्ध है, उदाहरण के लिए,' static_assert में (i == 20, "मैं सही"); '। - तो मेरा सवाल यह है कि 'std :: get' constexpr क्यों नहीं है? – Lars

+0

'constexpr' का विचार यह है कि संकलक को फ़ंक्शन कॉल के परिणाम की गणना करने के लिए कहा जा सकता है, जो तर्क भी कॉन्स्ट-एक्सप्रेशन हैं। – UncleBens

+0

यह मेरे द्वारा प्राप्त संदर्भों की मेरी पढ़ाई नहीं है। मेरी पढ़ाई यह है कि एक कॉन्स्टेक्स * एक निरंतर अभिव्यक्ति (मैक्रोज़ को प्रतिस्थापित करने) को वापस करने वाले इनलाइन फ़ंक्शन को परिभाषित कर सकता है, लेकिन यह केवल फ़ंक्शन * कॉल * कर सकता है यदि वह फ़ंक्शन स्वयं कॉन्स्टेक्सर है। –

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