क्या यह इस तरह के अस्तित्व के लिए संभव है?क्या सी ++ में लूप के लिए स्थैतिक विकसित करना संभव है?
template<int Channel>
void deduce_mask(Matrix const &src, int mask[])
{
//I hope i could become a constant and the compiler would unroll the loop at compile time
for(int i = Channel; i != -1; --i)
{
//mapper is a helper class which translate two and three dimension into one dimension index
//constexpr makes it possible to find out the index at compile time
mask[mapper(0, 1, i)] = src(row - 1, col)[i];
mask[mapper(1, 1, i)] = src(row, col)[i];
mask[mapper(2, 1, i)] = src(row + 1, col)[i];
}
}
template<int Channel>
class deduceMask
{
public:
static void deduce_mask(matrix const &src, int mask[]);
};
template<int Channel>
void deduce_mask(matrix const &src, int mask[])
{
mask[mapper(0, 1, Channel)] = src(row - 1, col)[Channel];
mask[mapper(1, 1, Channel)] = src(row, col)[Channel];
mask[mapper(2, 1, Channel)] = src(row + 1, col)[Channel];
deduceMask<Channel - 1>::deduce_mask(src, mask);
}
template<>
class deduceMask<-1>
{
public:
static void deduce_mask(matrix const &src, int mask[])
{
}
};
दूसरा समाधान के बजाय
एकमात्र समाधान मैं की है जब मैं चाहता हूँ आ सकता है संकलक बाहर संकलन time.Do में परिणाम निकालने की मैं लिए एक आसान तरीका है मेट्रोग्रामिंग समाधान जैसे निरंतर मान बनें? मेरे लिए, मेटाप्रोग्रामिंग संस्करण के बजाय काम करने के लिए एक आसान लूप अधिक आसान है।
मेरी खराब अंग्रेजी के लिए खेद है, मुझे उम्मीद है कि मैं अपनी समस्या को ठीक से समझाऊंगा।
यदि आप उस प्रकार के वाक्यविन्यास को पसंद करते हैं तो आप इसे बार-बार लिख सकते हैं और कंस्ट्रैक्स का उपयोग कर सकते हैं? – Agentlien
मैंने एक कॉन्स्टेक्स संस्करण बनाने की कोशिश की लेकिन असफल रहा, constexpr केवल एक रिटर्न स्टेटमेंट की अनुमति देता है। – StereoMatching
मैं काफी हद तक निश्चित हूं कि अधिकांश आधुनिक कंपाइलर स्वचालित रूप से इस अनुकूलन को करते हैं, जैसे कि वे निरंतर मान तक 'फॉर' लूप के लिए करते हैं (उदा। '(Int i = 0; i <5; i ++) ')। हालांकि आपको सुनिश्चित करने के लिए जांच करनी होगी। – ShdNx