Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Παίδες,

 

Ξέρει κανείς κάποιον 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. 

 

Δημοσ.

Ε πρεπει φτιαξεις ενα δικο σου. Δεν εχει νοημα να υπαρχει κατι το οποιο να κανει round το εκατομμυριο στο χιλιαρικο

Δημοσ.
#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;
}
Δημοσ.

Δεν νομιζω, τα cast στη c++ (std) δουλευουν παρεα με exceptions. Δηλαδη, κανε εσυ το καστ, και αν γινει καμια μαλακια θα σου πεταξω μια εξαιρεση για να κανεις τα δικα σου. Μπορει να υπαρχει κατι τετοιο σε καμια boost που και αυτη ειναι ενα "Standar"

Δημοσ.

BTw παπι..

 

Τώρα που το κοίταξα... αυτό που έφτιαξες δεν κάνει αυτό που ζητάω..

 

Επειδή μάλλον δεν έγινα κατανοητός (ή δεν το κατάλαβες) θέλω έναν απλό γραμμικό μετασχηματισμό. 

 

Αλλά από standard method της C++. 

 

Αυτό που κάνεις εσύ είναι απλά ένα type casting με safety checking. 

Δημοσ.

Τωρα γινεσαι σμιρνοφ(που εκραζε την c++ επειδη δεν εχει build in πραξεις με πινακες).

 

Οντως αλλο πραγμα καταλαβα. Μα ειναι δυνατον να υπαρχει κατι τετοιο σε μια τοσο γενικη γλωσσα; Δεν μιλας για type casting, μιλας για "συνολα casting", δηλαδη βλεπεις τους τυπους ως συνολα.

 

Εδιτ

Ασε που δεν παιζει να φτιαξεις κατι τετοιο διοτι υπαρχουν πολλες εξαιρεσεις, πχ πως θα "κασταρεις" ενα int "συνολο" σε ενα unsigned int "συνολο", ή ενα float σε ενα int;
 

Δημοσ.

Δεν έχω ασχοληθεί ποτέ με 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

 

αλλά εσύ το έχεις ξεσκίσει :P και δεν καταλαβαίνω χριστό :)

Δημοσ.

Καθόλου μεγάλο δεν είναι... κλασικότατο 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++. 

 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...