OVH Cloud OVH Cloud

template et const

22 réponses
Avatar
Fabien SK
Bonjour,

Je désire écrire une classe permettant de manipuler un sous-ensemble
d'un buffer texte. Cette classe n'aura comme donnée membre que le
pointeur sur la partie du buffer et la taille du buffer à manipuler.
Exemple:

class InBuffField
{
public:
InBuffField(char *pbuff, size_t len);

char* Get();
size Len()const;
void Trim(char c=' ');
bool Compare(InBuffField &other)const;
bool CompareTrim(InBuffField &other)const;
// [...]
private:
char *m_pBuff;
size_t m_Len;
};

char *pbuff = "TOTO 12345 TATA";
InBuffField field(pbuff, 6);
field.TrimRight();
std::cout << field.Length() << std::endl; // affiche '4'
std::cout.write(field.Get(), field.Length());

Mon problème est que je veux supporter dans cette classe à la fois les
pointeurs vers des "char*" et des "const char*". La version avec "const
char*" n'aurait donc pas accès à des méthode telles que "Replace".

Je dois donc décider d'un type pour "m_pBuff". Je ne vois pas comment
faire, à part en faisant une classe template pouvant prendre comme type
"char" ou "const char". Par contre après, ça va me poser des problèmes
pour mes méthodes "Compare" car elles vont devoir comparer des objets de
type:
- InBuffField<char>
- InBuffField<const char>

J'ai pensé à la conversion automatique (fonction membre):

operator InBuffField<const _CH>()const
{
return InBuffField<const _CH>(m_pBuff, m_Len);
}

Mais je sens que ça va me mener à des effets aussi indésirables
qu'inattendus.

Si vous avez une idée de design, je suis preneur.
Merci de votre attention

Fabien

2 réponses

1 2 3
Avatar
drkm
Gabriel Dos Reis writes:

drkm writes:

| Je ne pense pas -- à confirmer -- que la norme impose une
| manière spécifique de stocker une chaîne de caractères litérale.

à part que c'est une lvalue et un tableau ?


Oui. Je voulais parler de l'endroit de stockage [*]. Mais je crois
finalement que la norme parle bien des différents endroits, tels que
la pile, le tas, le « free store », etc., et qu'elle attribue un de
ces endroits aux chaînes de caractères litérales.

[*] Ouais, quand j'ai dit « une manière spécifique de stocker »,
il fallait lire « une manière et un endroit spécifiques pour
stocker ».

Donne-t-elle d'autres précisions (donne-t-elle d'abord ces
précisions ?) ?

--drkm

Avatar
Gabriel Dos Reis
drkm writes:

| Gabriel Dos Reis writes:
|
| > drkm writes:
|
| > | Mais qu'en est-il finalement de l'affectation initiale :
|
| > | char * str = "..." ;
|
| > deprecated.
|
| Donc légal ?!?

quelque chose qui est deprecated est forcément valide, sinon cela
n'aurait pas de sens :-)

| J'étais persuadé que ce n'était légal que dans les C
| ancestraux, pré-C89, et certainement plus en C++98.

c'est une construction assez fréquente en C. Est-ce que le bénéfice
qu'on tire en cassant de tel code C en vaut la chandelle ?

-- Gaby
1 2 3