मैं ऐसी संरचना बनाना चाहता हूं जो स्थिर रूप से 2^एन बाइट्स की सरणी आवंटित करे, लेकिन मैं नहीं चाहता कि इस संरचना के उपयोगकर्ता एक्सपोनेंट के रूप में इस आकार को निर्दिष्ट करें। उदाहरण:मैं कैसे जांचूं कि टेम्पलेट पैरामीटर दो की शक्ति है या नहीं?
my_stupid_array<char, 32> a1; // I want this!
my_stupid_array<char, 5> a2; // And not this...
मैं कैसे पता चलेगा अगर यह टेम्पलेट पैरामीटर दो और की एक शक्ति चेतावनी दी है इस बारे में एक अच्छा संदेश के साथ उपयोगकर्ता है?
मैं एक साधारण टेम्पलेट के साथ इस के लिए जाँच कर लिया है:
template<int N>
struct is_power_of_two {
enum {val = (N >= 1) & !(N & (N - 1))};
};
हालांकि, मैं एक समझदार संदेश के साथ इस बारे में उपयोगकर्ता को सचेत करने में असमर्थ हूँ। कोई विचार?
संपादित
अस्पष्ट उदाहरण फिक्स्ड।
संपादित
1 दो वास्तव में की एक शक्ति है। फिक्स्ड कि! :)
संपादित
BOOST_STATIC_ASSERT का उपयोग करना, मैं जीसीसी के साथ इस कोड के लिए इस संकलन त्रुटि हो रही है:
template<int N>
struct is_power_of_two {
enum {val = (N >= 1) & !(N & (N - 1))};
BOOST_STATIC_ASSERT(val);
};
त्रुटि
..\main.cpp:29:1: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>'
संपादित करें
ओह, मुझे यह मिल गया। यही वह संदेश था जिसे मैं असफल होने पर प्राप्त करना चाहता था। लेकिन यह उपयोगकर्ता को कुछ सौ संदेश देने में विफल रहता है।:(बचाव के लिए
8 2 की शक्ति है ... –
यह पैरामीटर के रूप में एक्सपोनेंट का एक उदाहरण के रूप में है। 2^8 = 256 – jrok
> 'my_stupid_array a2; // और यह नहीं ... 'ऐसा क्यों नहीं? –
triclosan