Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

c++0x et User-defined literals

4 réponses
Avatar
Michael Doubez
Quel calme apr=E8s toutes ces discussions !

J'aimerais lancer un petit sondage.
D'apr=E8s C++1x, je pourrai =E9crire:

// proxy fonctor pour =E9lever un nombre =E0 la puissance en param=E8tre
struct puissance_proxy
{
puissance_proxy(long n=3D0):nombre(n){}
long nombre;

// renvoie nombre =E0 la puissance p
constexpr long operator()(long p)const
{
return pow(nombre,p); // supposant que pow(long,long) existe
}
};

// user defined literal pour g=E9n=E9rer un puissance_proxy d'un nombre
constexpr puissance_proxy operator "" puissance(long n)
{
return puissance_proxy(n);
}

Ce qui me permet d'=E9crire:
const long valeur=3D2puissance(8);

Pour ou contre une utilisation de ce genre ?

--
Michael

4 réponses

Avatar
Senhon
"Michael Doubez" a écrit dans le message de groupe
de discussion :

Quel calme après toutes ces discussions !

J'aimerais lancer un petit sondage.
D'après C++1x, je pourrai écrire:

// proxy fonctor pour élever un nombre à la puissance en paramètre
struct puissance_proxy
{
puissance_proxy(long n=0):nombre(n){}
long nombre;

// renvoie nombre à la puissance p
constexpr long operator()(long p)const
{
return pow(nombre,p); // supposant que pow(long,long) existe
}
};

// user defined literal pour générer un puissance_proxy d'un nombre
constexpr puissance_proxy operator "" puissance(long n)
{
return puissance_proxy(n);
}

Ce qui me permet d'écrire:
const long valeur=2puissance(8);

Pour ou contre une utilisation de ce genre ?



Pour ! c'est plus concis !
Ceux que cette écriture gênerai ne sont pas obliger d'utiliser.
Avatar
Gabriel Dos Reis
Michael Doubez writes:

| Quel calme après toutes ces discussions !
|
| J'aimerais lancer un petit sondage.
| D'après C++1x, je pourrai écrire:
|
| // proxy fonctor pour élever un nombre à la puissance en param ètre
| struct puissance_proxy
| {
| puissance_proxy(long n=0):nombre(n){}

Note que comme le constructeur n'est pas constexpr, ce type n'est pas un
« literal type »

| long nombre;
|
| // renvoie nombre à la puissance p
| constexpr long operator()(long p)const
| {
| return pow(nombre,p); // supposant que pow(long,long) existe

est-ce que 'pow()' est constexpr ?

-- Gaby
Avatar
Michael Doubez
On 24 juil, 17:02, Gabriel Dos Reis wrote:
Michael Doubez writes:

| Quel calme après toutes ces discussions !
|
| J'aimerais lancer un petit sondage.
| D'après C++1x, je pourrai écrire:
|
| // proxy fonctor pour élever un nombre à la puissance en paramètr e
| struct puissance_proxy
| {
|     puissance_proxy(long n=0):nombre(n){}

Note que comme le constructeur n'est pas constexpr, ce type n'est pas un
« literal type »



Oups. Merci


|     long nombre;
|
|     // renvoie nombre à la puissance p
|     constexpr long operator()(long p)const
|     {
|        return pow(nombre,p); // supposant que pow(long,long) ex iste

est-ce que 'pow()' est constexpr ?



long pow(long, long) n'existe pas dans le standard alors pourquoi pas.

Remplaçons la pusissance par un unsigned pour éviter les problèmes de
signe:
constexpr unsigned long pow(long v, unsigned p,long accumulate=1l)
{
return p>0?pow(v,p-1,accumulate*v):accumulate;
}

--
Michael
Avatar
Gabriel Dos Reis
Michael Doubez writes:

| On 24 juil, 17:02, Gabriel Dos Reis wrote:
| > Michael Doubez writes:
| >
| > | Quel calme après toutes ces discussions !
| > |
| > | J'aimerais lancer un petit sondage.
| > | D'après C++1x, je pourrai écrire:
| > |
| > | // proxy fonctor pour élever un nombre à la puissance en pa ramètre
| > | struct puissance_proxy
| > | {
| > |     puissance_proxy(long n=0):nombre(n){}
| >
| > Note que comme le constructeur n'est pas constexpr, ce type n'est pas un
| > « literal type »
|
| Oups. Merci

Dans ce cas, tu as envie d'écrire

constexpr long valeur=2puissance(8);

si tu voulais t'assurer que valeur est vraiment une constante.

-- Gaby