2010-09-28 9 views
11

मुझे एक समस्या है जो उस कोड में काफी आम है जिसे मैं इस समय लिख रहा हूं जिससे मैं एक पूर्णांक प्राप्त करना चाहता हूं जो केवल एक निश्चित सीमा के भीतर मौजूद हो जहां सीमा [प्रारंभ, अंत) हो। असल में मैं निम्नलिखित की तरह कुछ करने में सक्षम होना चाहता हूं:क्या सी ++ में मानक साइक्लिक इंटीजर क्लास है?

cyclic_int ci(4, 8); 

ci = 4; 
assert(ci == 4); 
ci += 3; 
assert(ci == 7); 
ci += 2; 
assert(ci == 5); 
assert(ci == 13); 

और यह सब सच हो जाना चाहिए। मूल रूप से कक्षा स्वचालित रूप से मेरे लिए मॉड्यूलस (%) लागू करती है और पूर्णांक उस श्रेणी में चक्रीय पूर्णांक के रूप में कार्य करता है जिसे मैंने इसमें शामिल किया है। मैं इस कक्षा को अपने आप कार्यान्वित कर सकता हूं और सभी सामान्य ऑपरेटरों को अधिभारित कर सकता हूं ताकि यह सामान्य पूर्णांक के साथ अच्छी तरह से काम कर सके लेकिन यह एक उपयोगी वर्ग की तरह लगता है जिसे किसी ने पहले बनाया हो।

तो मेरा सवाल यह है कि, क्या वहां कहीं ऐसा एक सामान्य वर्ग है जहां हर कोई इसका उपयोग करता है या मैं इसे गलत तरीके से करने के बारे में सोच रहा हूं और क्या यह एक बेहतर तरीका है। (मेरा लक्ष्य है कि% ऑपरेटर या उस पर किसी भी समान कार्य को लागू करने के बारे में लगातार विचार न करें) धन्यवाद।

संपादित करें: http://github.com/robertmassaioli/wrapping_number

+1

पर जहाँ तक है जैसा कि मुझे पता है कि इस तरह की चीज़ के लिए कोई "उद्योग-मानक" नहीं है - बूस्ट लाइब्रेरी की तरह, यदि आपका यही मतलब है। लेकिन जैसा कि आपने कहा था, इस तरह के वर्ग को लागू करने और सभी आवश्यक ऑपरेटरों को अधिभारित करने के लिए पर्याप्त आसान होना चाहिए। –

+1

किसी उत्तर के बजाए टिप्पणी का उपयोग करना क्योंकि 1) मैंने इसका कभी भी उपयोग नहीं किया और 2) यह अभी तक एक आधिकारिक बूस्ट लाइब्रेरी नहीं है लेकिन: बूस्ट। कॉन्स्ट्रेनेड वैल्यू में एक "रैपिंग_इन्ट" है जो आप जो खोज रहे हैं उसके समान दिखता है: http: //student.agh.edu.pl/~kawulak/constrained_value/constrained_value/tutorial.html#constrained_value.tutorial.other_error_policies_for_bounded_objects –

+0

@Eric: यही वही है जो मैं खोज रहा था लेकिन यह अभी तक बूस्ट लाइब्रेरीज़ से अलग नहीं है। मैंने चारों ओर देखने की कोशिश की और संदर्भ कार्यान्वयन नहीं मिला। मैं देखता रहूंगा लेकिन क्या आप जानते हैं कि कोई कहां है? –

उत्तर

2

मैंने कभी इसका उपयोग नहीं किया और यह अभी तक एक आधिकारिक बूस्ट लाइब्रेरी नहीं है, लेकिन बूस्ट। कॉन्स्ट्रेनेड वैल्यू में wrapping_int है जो आप जो खोज रहे हैं उसके समान दिखता है।

हालांकि यह अभी तक बूस्ट का एक हिस्सा नहीं है, यह समीक्षा की गई और, IIUC, सशर्त हाल ही में स्वीकार किए जाते हैं: http://lists.boost.org/boost-announce/2010/09/0265.php

पुस्तकालय http://rk.dl.pl/f/constrained_value.zip

पर उपलब्ध है प्रलेखन http://rk.dl.pl/r/constrained_value

+0

मैंने अपना खुद का एक मजेदार भी लिखा है: http://github.com/robertmassaioli/wrapping_number –

4

यह समारोह normalize उपयोग करना आसान नहीं है: मैं सिर्फ मनोरंजन के लिए और साथ ही अपने ही एक लिखने का फैसला किया?

int normalize(int val, int start, int end) 
{ 
    return (val - start) % (end - start) + start; 
} 


int ci = 4; 
assert(ci == 4); 
ci = normalize(ci + 3, 4, 8); 
assert(ci == 7); 
ci = normalize(ci + 2, 4, 8); 
assert(ci == 5); 
assert(ci == 13); 
+1

वही था जो मैं टालने की कोशिश कर रहा था क्योंकि मैं सामान्यीकृत कार्य को लागू करने के बारे में वास्तव में सोचना नहीं चाहता (क्योंकि मैं अंततः भूल जाऊंगा)। और आखिरी जोर भी असफल हो जाएगा मुझे लगता है? –

+0

वास्तव में, मुझे लगता है कि अंतिम जोर विफल होना चाहिए, क्योंकि 13 को सीमा-सीमित संख्या के रूप में परिभाषित नहीं किया गया है, मैं जोर से उपयोग करूंगा (सीआई == cyclic_int <4,8> (13)); (टेम्पलेट यहां सुविधाजनक है) – stefaanv

+0

@stefaanv: मुझे लगता है कि वह क्या प्राप्त कर रहा है यह है कि 13 चक्रवात_आईंट (4, 8) में 5 होना चाहिए (यानी पूर्णांक 4, 5, ...12), जो यह है। मैं एक टेम्पलेट की धारणा से सहमत हूं ... मजबूत टाइपिंग प्रदान करता है। – andand

1

ये बिल्कुल नहीं हो सकता है कि आप क्या चाहते हैं, लेकिन आप वहाँ बाहर कई गाल्वा क्षेत्र पुस्तकालयों में से एक (http://www.google.co.uk/search?q=galois+field+c%2B%2B+library) में रुचि हो सकती। मैंने कभी भी उनमें से कोई भी उपयोग नहीं किया है, इसलिए मैं एक विशिष्ट सिफारिश नहीं दे सकता।