OVH Cloud OVH Cloud

Template parameter & double ?

3 réponses
Avatar
Stephane Wirtel
Bonjour,

Dans les specs présentes et/ou à venir, pourra-t-on utiliser
des built-in types différents de int comme template arguments ?

Je pensais pouvoir créer une class template permettant de checker
la valeur d'une variable encapsulée dans cette classe.

Comme l'exemple suivant.

template <typename DataType, DataType low, DataType high> class OutOfBoundsThrower {
public:
static DataType Check (DataType newValue) throw (std::exception) {
if (newValue < low || newValue > high) {
throw std::out_of_range ("OutOfBounds : Check failed !!!");
}
return newValue;
}
};

Par la suite en hérité une classe template de cette classe, il aurait été possible
de faire des tests automatiques lors de la modification de la valeur de l'objet encapsulé.

Voici le lien suivant qui explique plus en détail la démarche sur laquelle je me base.

http://www.oxyware.com/CheckedInt.pdf

Le léger soucis avec ce code, est qu'il n'est pas possible d'employer des valeurs basé
sur des doubles, floats.

De plus, afin de le rendre encore plus générique, cela aurait pû être utile de vérifier
sur des types définit par le développeur, comme par exemple des classes gérant les dates.
Mais cette dernière solution n'est pas fort envisageable car il y a instanciation
d'un objet de type datetime et cela ne peut se faire qu'au RunTime.

La question est, avez-vous déjà essayé de résoudre ce problème, si oui de quelle manière.



Merci,

Stéphane

3 réponses

Avatar
Falk Tannhäuser
Stephane Wirtel wrote:
template <typename DataType, DataType low, DataType high> class
OutOfBoundsThrower {
public:
static DataType Check (DataType newValue) throw (std::exception) {
if (newValue < low || newValue > high) {
throw std::out_of_range ("OutOfBounds : Check failed !!!");
}
return newValue;
}
};


Pourquoi pas

template<typename T> class OutOfBoundsThrower
{
T low;
T high;
public:
OutOfBoundsThrower(T const& lo, T const& hi) : low(lo), high(hi) {}

T operator()(T const& t) const
{
if(t < low || t > high)
throw std::out_of_range("O kurcza!");
return t;
}
};

Falk

Avatar
Jean-Marc Bourguet
Stephane Wirtel writes:

Dans les specs présentes et/ou à venir, pourra-t-on utiliser des
built-in types différents de int comme template arguments ?


Je n'ai rien vu a ce sujet, et j'en doute.

Je pensais pouvoir créer une class template permettant de checker la
valeur d'une variable encapsulée dans cette classe.


Comme souvent, ajouter un niveau d'indirection aide. Un petit
probleme ici, c'est que dans une classe on ne peut pas definir des
constantes autres qu'entieres avec de bonnes chances que le
compilateur les voient a la compilation, donc je propose d'utiliser
des fonctions inline.

template <typename DataType, typename DataRange>
struct OutOfBoundsThrower
{
static DataType Check(DataType value) throw (std::exception) {
if (value < DataRange::low() || DataRange::high() < value) {
throw std::out_of_range("OutOfBounds, check failed !!!");
} else {
return value;
}
}
};

A utiliser avec comme DataRange quelque chose comme:

struct Interval {
static double low() { return 0; }
static double high() { return 2*M_PI; }
};

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Jean-Marc Bourguet
Falk Tannhäuser writes:

Stephane Wirtel wrote:
template <typename DataType, DataType low, DataType high> class
OutOfBoundsThrower {
public:
static DataType Check (DataType newValue) throw (std::exception) {
if (newValue < low || newValue > high) {
throw std::out_of_range ("OutOfBounds : Check failed !!!");
}
return newValue;
}
};


Pourquoi pas

template<typename T> class OutOfBoundsThrower
{
T low;
T high;


Ca augmente la taille des objets et complique leur construction.

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org