Timonkaipumpa Δημοσ. 31 Αυγούστου 2013 Δημοσ. 31 Αυγούστου 2013 Παίδες, Ξέρει κανείς κάποιον ANSI C++ τρόπο για safe type casting σε primitive data types που να κάνει και scaling τα values για να μην υπάρχει overflow; Τι εννοώ.. Εάν έχουμε έναν LONG_MAX να μπορεί να το κάνει σε SHORT_MAX και όχι να δώσει o-flow. Και όλο αυτό από standard library και όχι κάποιο extension ή O.S. specific lib και όχι από C++11. Υ.Γ. Στην ουσία ψάχνω μία έτοιμη method για τον γραμμικό μετασχηματισμό που πρέπει να γίνει αλλά αυτή η method να είναι standard και όχι C++11.
παπι Δημοσ. 31 Αυγούστου 2013 Δημοσ. 31 Αυγούστου 2013 Ε πρεπει φτιαξεις ενα δικο σου. Δεν εχει νοημα να υπαρχει κατι το οποιο να κανει round το εκατομμυριο στο χιλιαρικο
Timonkaipumpa Δημοσ. 31 Αυγούστου 2013 Μέλος Δημοσ. 31 Αυγούστου 2013 Δεν είναι round... και έχει νόημα
παπι Δημοσ. 31 Αυγούστου 2013 Δημοσ. 31 Αυγούστου 2013 #include <iostream> #include <queue> #include <string> #include <type_traits> template <class TR, class TS> TR cast(const TS& source) { typedef std::conditional<sizeof(TS) < sizeof(TR),TR,TS>::type T; T val = (T)source; if( val > std::numeric_limits<TR>::max() || val < std::numeric_limits<TR>::min() ) { return val > 0 ? std::numeric_limits<TR>::max() : std::numeric_limits<TR>::min(); } return val; } int main() { short a = cast<short,int>(65000 * 2); return 0; } Εφτιαξα αυτο. μπορει να εχει κανα bug, αλλα τωρα δεν το βλεπω εδιτ εβαλα μια κουταλια ζαχαρη template <class TResult, class TSource> TResult cast(const TSource& source) { typedef std::conditional<sizeof(TSource) < sizeof(TResult),TResult,TSource>::type TBigger; TBigger val = (TBigger)source; if( val > std::numeric_limits<TResult>::max() || val < std::numeric_limits<TResult>::min() ) { return val > 0 ? std::numeric_limits<TResult>::max() : std::numeric_limits<TResult>::min(); } return val; }
Timonkaipumpa Δημοσ. 31 Αυγούστου 2013 Μέλος Δημοσ. 31 Αυγούστου 2013 Βρε παπι.. thnx αλλά δεν θέλω κάτι φτιαχτό... το έφτιαχνα και εγώ.. κλάιν.. Το θέμα είναι εάν υπάρχει έτοιμο από std library της C++.
παπι Δημοσ. 31 Αυγούστου 2013 Δημοσ. 31 Αυγούστου 2013 Δεν νομιζω, τα cast στη c++ (std) δουλευουν παρεα με exceptions. Δηλαδη, κανε εσυ το καστ, και αν γινει καμια μαλακια θα σου πεταξω μια εξαιρεση για να κανεις τα δικα σου. Μπορει να υπαρχει κατι τετοιο σε καμια boost που και αυτη ειναι ενα "Standar"
Timonkaipumpa Δημοσ. 31 Αυγούστου 2013 Μέλος Δημοσ. 31 Αυγούστου 2013 BTw παπι.. Τώρα που το κοίταξα... αυτό που έφτιαξες δεν κάνει αυτό που ζητάω.. Επειδή μάλλον δεν έγινα κατανοητός (ή δεν το κατάλαβες) θέλω έναν απλό γραμμικό μετασχηματισμό. Αλλά από standard method της C++. Αυτό που κάνεις εσύ είναι απλά ένα type casting με safety checking.
παπι Δημοσ. 31 Αυγούστου 2013 Δημοσ. 31 Αυγούστου 2013 Τωρα γινεσαι σμιρνοφ(που εκραζε την c++ επειδη δεν εχει build in πραξεις με πινακες). Οντως αλλο πραγμα καταλαβα. Μα ειναι δυνατον να υπαρχει κατι τετοιο σε μια τοσο γενικη γλωσσα; Δεν μιλας για type casting, μιλας για "συνολα casting", δηλαδη βλεπεις τους τυπους ως συνολα. Εδιτ Ασε που δεν παιζει να φτιαξεις κατι τετοιο διοτι υπαρχουν πολλες εξαιρεσεις, πχ πως θα "κασταρεις" ενα int "συνολο" σε ενα unsigned int "συνολο", ή ενα float σε ενα int;
sonyxp Δημοσ. 1 Σεπτεμβρίου 2013 Δημοσ. 1 Σεπτεμβρίου 2013 Δεν έχω ασχοληθεί ποτέ με templates. Μπορείς σε παρακαλώ να εξηγήσεις λίγο τι σημαίνει αυτό? typedef std::conditional<sizeof(TSource) < sizeof(TResult),TResult,TSource>::type TBigger; το typedef αποτελείται από 2 κομμάτια, πχ #typedef unsigned int UINT Άρα για να το αναλύσω λίγο αυτό που έγραψες... typedef std::conditional<sizeof(TSource) < sizeof(TResult),TResult,TSource>::type TBigger; συνήθως (για μένα) σε typedef δηλώνουμε κάτι, σπάνια αρχικοποιούμε κάτι τόσο μεγάλο, άντε κάνα τέτοιο typedef PI 3.14 αλλά εσύ το έχεις ξεσκίσει και δεν καταλαβαίνω χριστό
Timonkaipumpa Δημοσ. 1 Σεπτεμβρίου 2013 Μέλος Δημοσ. 1 Σεπτεμβρίου 2013 Καθόλου μεγάλο δεν είναι... κλασικότατο conditional... Check this out. Τωρα γινεσαι σμιρνοφ(που εκραζε την c++ επειδη δεν εχει build in πραξεις με πινακες). Οντως αλλο πραγμα καταλαβα. Μα ειναι δυνατον να υπαρχει κατι τετοιο σε μια τοσο γενικη γλωσσα; Δεν μιλας για type casting, μιλας για "συνολα casting", δηλαδη βλεπεις τους τυπους ως συνολα. Εδιτ Ασε που δεν παιζει να φτιαξεις κατι τετοιο διοτι υπαρχουν πολλες εξαιρεσεις, πχ πως θα "κασταρεις" ενα int "συνολο" σε ενα unsigned int "συνολο", ή ενα float σε ενα int; Καστάρετε... είναι μία εφαρμογή των συναρτήσεων ymax = axmax + b ymin = axmin + b με ανάλογη εφαρμογή των τελεστών ceil, floor και round... Απλά.. εάν υπήρχε standard τρόπος θα μπορούσε κανείς να τον εφαρμόσει με vectors και accumulate, find_if, find κτλ μεθόδους από την algorithm, να έχει iterators (και reverse_iterator), να εφαρμόσει εν γένει ό,τι καλούδια έχει η C++.
Timonkaipumpa Δημοσ. 1 Σεπτεμβρίου 2013 Μέλος Δημοσ. 1 Σεπτεμβρίου 2013 Λίγο άσχετο... αλλά μιας και είναι δικό μου thread.. ας του κάνω hijack. Ποιο θεωρείτε το καταλληλότερο std exception object για throw σε divide by zero;
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα