यह सी ++ 0x के साथ ही संभव है। सी ++ 03 के साथ कोई मौका नहीं।
संपादित करें: सी ++ 0x के लिए कॉन्स्टेक्सप्रस फ़ंक्शन। निम्नलिखित GCC4.6 के साथ काम करता है, हालांकि मानक इसे अनुमति देने में स्पष्ट नहीं है, और एक छोटा सा शब्द ट्विक था और इसे spec को अनुमति देने के लिए विचार किया जा रहा है।
constexpr bool isequal(char const *one, char const *two) {
return (*one && *two) ? (*one == *two && isequal(one + 1, two + 1))
: (!*one && !*two);
}
static_assert(isequal("foo", "foo"), "this should never fail");
static_assert(!isequal("foo", "bar"), "this should never fail");
कंपाइलर को सभी रिकर्स में पहले से ही स्ट्रिंग अक्षर के पात्रों के संदर्भ को ट्रैक करने की आवश्यकता है। केवल पात्रों से अंतिम पढ़ने की अनुमति नहीं है (यदि आप स्क्विंट करते हैं, तो आप इसे अनुमति के रूप में पढ़ सकते हैं, आईएमओ)। अपने संकलक ऊपर सरल संस्करण को स्वीकार नहीं करना चाहता है, तो आप अपने मैक्रो घोषित सरणियों कर सकते हैं और फिर उन
#define CONCAT1(A, B) A ## B
#define CONCAT(A, B) CONCAT1(A, B)
#define CHECK_EQUAL(A, B) \
constexpr char CONCAT(x1, __LINE__)[] = A, \
CONCAT(x2, __LINE__)[] = B; \
static_assert(isequal(CONCAT(x1, __LINE__), CONCAT(x2, __LINE__)), \
"'" A "' and '" B "' are not equal!")
यह निश्चित रूप से ठीक है की तुलना करें।
CHECK_EQUAL("foo", "foo"); /* will pass */
CHECK_EQUAL("foo", "bar"); /* will fail */
ध्यान दें कि CHECK_EQUAL
कार्यों के अंदर उपयोग किया जा सकता है। एफसीडी ने अपने आमंत्रण प्रतिस्थापन में स्वचालित सरणी से पढ़ने के लिए constexpr
कार्यों को अनुमति देने के लिए एक बदलाव किया है। DR1197 देखें।
क्या आप सी ++ 0x रास्ता दिखा सकते हैं या एक लिंक प्रदान कर सकते हैं? – pmr
+1 लेकिन, मुझे हमेशा संदेह है कि यह मेटाप्रोग्रामिंग का उपयोग कर सी ++ में संभव हो सकता है। लेकिन मैं इसे कभी पूरा करने में सक्षम नहीं हूं। क्षितिज पर सी ++ 0x के साथ, मैंने कोशिश छोड़ दी। –
इसका मतलब है कि C++ टेम्पलेट भाषा में एक कंपाइलर लिखना संभव हो सकता है। वू हू! – Omnifarious