मैं बस एक बाइनरी शाब्दिक operator ""_b
हैक करने की कोशिश कर रहा था, लेकिन रिकर्सन को समाप्त करने की कोशिश कर रहा था। एक फ़ंक्शन को परिभाषित करने के लिए जिसे एक खाली स्पष्ट टेम्पलेट पैरामीटर सूची का उपयोग करके बुलाया जा सकता है, जो पैरामीटर पैक अधिभार के साथ संघर्ष नहीं करता है? फिर, प्रेरणा: कुछ खाली बेकार के लिए खाली पैक विस्तार से मेल खाते हैं।क्या एक खाली मूल्य पैक विस्तार एक प्रकार पैक या वैकल्पिक प्रकार पैरामीटर से मेल खाता है?
लेकिन जीसीसी शिकायत करता है कि रिक्त तर्क सूची के किसी भी प्रकार के प्रकार पैरामीटर सूची के स्पष्ट रूप से आवश्यक प्रकारों से सहमत नहीं हैं। क्या यह इस तरह से काम करना चाहिए?
template< char head, char ... tail >
constexpr unsigned long long parse_binary() {
return ((head - '0') << sizeof ... (tail))
+ parse_binary< tail ... >(); // Error: no overload for termination.
}
template< typename = void > // I want this to match an empty pack of chars.
// template< short = 0 > // even this would do.
constexpr unsigned long long parse_binary() {
return 0;
}
template< char ... digits >
constexpr unsigned long long operator ""_b() {
return parse_binary< digits ... >();
}
#include <iostream>
int main() {
std::cout << 010101_b << '\n';
}
नोट: प्रश्न operator ""_b
लागू नहीं कर रहा है। उस समस्या को पैरामीटर सूची में पैक का विस्तार करके हल किया जा सकता है, और std::integral_constant
प्रकारों को पास कर सकता है।
नोट 2: यह कोड वास्तव में मामूली समायोजन के साथ काम करता है; नीचे मेरा जवाब देखें। लेकिन यह सीधे सवाल को संबोधित नहीं करता है। हम्म, शायद मुझे जवाब देने के बजाय इसे संपादित करना चाहिए था ...
सामान्य तौर पर आप मूल टेम्पलेट 'टेम्पलेट बनाने <चार सिर, चार पहले, चार ... पूंछ> द्वारा' प्रत्यावर्तन समाप्त कर सकते हैं, और समाप्ति के लिए 'टेम्पलेट' का उपयोग करें - लेकिन मुझे लगता है कि आप जो पूछ रहे हैं वह नहीं है। –
@ BjörnPollex No, फिर दो तर्कों को पारित करना संदिग्ध होगा। पैक खाली होने की अनुमति है। एक 'टेम्पलेट < char head >' और एक 'टेम्पलेट 'चाल करेगा, लेकिन हाँ, यह सवाल नहीं है। –
Potatoswatter