2012-01-31 10 views
5
struct Matrix(int row, int col){ /* ... */ } 

// finds the inverse using Gauss–Jordan elimination 
pure M inverse(M)(const ref M m){ /* ... */ } 

कारण mref प्रदर्शन की वजह से है। जाहिर है, मैं नहीं चाहता कि हर बार उलटा होने की आवश्यकता होने पर बड़ी मैट्रिक्स की प्रतिलिपि बनाई जा रही हो, और इसने अभी तक ठीक काम किया है।संकलन समय पर 'ref' का उपयोग कैसे करें?

लेकिन, यह जहां उलटा संकलन समय पर की जरूरत है स्थितियों में एक समस्या बन गया है:

mixin template A(){ 

    alias Matrix!(3, 3) Matrix3x3; 

    static Matrix3x3 computeSomeMatrix(){ } 

    immutable Matrix3x3 _m = computeSomeMatrix(); 
    immutable Matrix3x3 _m_1 = inverse(computeSomeMatrix()); // error 
} 

त्रुटि को ठीक करने के लिए, मैं एक गैर रेफरी को m बदलने की जरूरत है, लेकिन यह है कि इसका मतलब है कि मैट्रिक्स हर बार inverse() कहा जाता है की प्रतिलिपि बनाई जाएगी। मैं क्या करूं?

+0

या बस बस रेफरी और गैर-रेफरी 'उलटा()' वेरिएंट दोनों हैं? – DejanLekic

+1

आपको क्या सटीक त्रुटि मिल रही है? 'रेफरी' को संकलन समय पर काम करना चाहिए, शायद यह कुछ और है जो आप कर रहे हैं जो इसका कारण बन रहा है। – Robert

+4

क्या आपने 'ऑटो रेफरी' की कोशिश की है? –

उत्तर

4

मुझे दो विकल्पों में से एक दिखाई देता है। एक, एक संस्करण बनाएं जो एक रावल्यू लेता है। यह अक्सर परेशान होता है जब कोई फ़ंक्शन किसी भी तरह से राजस्व के साथ काम नहीं करता है। एक साधारण आवरण सभी की जरूरत है:

pure M inverse(M)(const ref M m){ /* ... */ } 
pure M inverse(M)(const M m){ inverse(m); } 

सावधान रहें कि मापदंडों के स्थिरांक सत्ता हालांकि मेल खाता है, या आप अनंत प्रत्यावर्तन पाने के लिए जा रहे हैं।

हालांकि, auto ref का उपयोग करने के लिए एक बेहतर समाधान होगा। यही वह है जिसे इसके लिए बनाया गया था।

pure M inverse(M)(const auto ref M m){ /* ... */ } 

संकलक तो उपयोग करेगा ref जब उचित हो और गैर ref जब उचित बिना आप इसके बारे में चिंता करने के लिए।

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