Bonjour,
Je débute un peu en C++ et notamment pour ce qui concerne les templates.
Je me base sur la documentation que je trouve sur internet pour me former
(notamment http://www.cplusplus.com).
Aujourd'hui, j'ai un problème que je n'arrive pas à résoudre malgré mes
recherches.
Je crée une classe template Matrix qui doit me servir à manipuler des
matrices, ainsi :
templace<int COLS, int ROWS, class T = float>
class Matrix
{
private:
std::vector<T> mData;
public:
// plusieurs méthodes
// ...
// la méthode qui me pose problème :
void setIdentity();
};
T est là pour permettre de choisir entre float et double, idéalement
j'aurais préféré m'en passer, car il n'y a pas vraiment d'intérêt
(mathématique) à manipuler des matrices de TrucMuches ou autres types
exotiques.
La méthode setIdentity() ne peut fonctionner que lorsque T est float ou
double. Elle initialise toutes les données de mon vector à 0.0 sauf la
diagonale qui est initialisée à 1.
De plus ROWS et COLS doivent être égaux (matrice carrée).
Par exemple pour une Matrix<2, 2, float>, setIdentity ferait cela :
for(unsigned y = 0; y < ROWS; y++)
{
for(unsigned x = 0; x < COLS; x++)
{
if(x == y) mData[x + y * COLS] = 1.0f;
else mData[x + y * COLS] = 0.0f;
}
}
Je voudrais que pour le cas où T n'est ni float ni double cette méthode ne
fasse rien, et pour le cas de float elle utilise 1.0f et 0.0f alors que
pour double elle utiliserait 1.0 et 0.0.
Je pensais spécialiser cette méthode pour cela, mais je ne trouve pas la
bonne syntaxe.
Parmi tant d'autres syntaxes j'ai essayé celle-ci :
template <int ROWS, int COLS, T>
void Matrix<ROWS, COLS, float>::setIdentity()
{
}
Bonjour,
Je débute un peu en C++ et notamment pour ce qui concerne les templates.
Je me base sur la documentation que je trouve sur internet pour me former
(notamment http://www.cplusplus.com).
Aujourd'hui, j'ai un problème que je n'arrive pas à résoudre malgré mes
recherches.
Je crée une classe template Matrix qui doit me servir à manipuler des
matrices, ainsi :
templace<int COLS, int ROWS, class T = float>
class Matrix
{
private:
std::vector<T> mData;
public:
// plusieurs méthodes
// ...
// la méthode qui me pose problème :
void setIdentity();
};
T est là pour permettre de choisir entre float et double, idéalement
j'aurais préféré m'en passer, car il n'y a pas vraiment d'intérêt
(mathématique) à manipuler des matrices de TrucMuches ou autres types
exotiques.
La méthode setIdentity() ne peut fonctionner que lorsque T est float ou
double. Elle initialise toutes les données de mon vector à 0.0 sauf la
diagonale qui est initialisée à 1.
De plus ROWS et COLS doivent être égaux (matrice carrée).
Par exemple pour une Matrix<2, 2, float>, setIdentity ferait cela :
for(unsigned y = 0; y < ROWS; y++)
{
for(unsigned x = 0; x < COLS; x++)
{
if(x == y) mData[x + y * COLS] = 1.0f;
else mData[x + y * COLS] = 0.0f;
}
}
Je voudrais que pour le cas où T n'est ni float ni double cette méthode ne
fasse rien, et pour le cas de float elle utilise 1.0f et 0.0f alors que
pour double elle utiliserait 1.0 et 0.0.
Je pensais spécialiser cette méthode pour cela, mais je ne trouve pas la
bonne syntaxe.
Parmi tant d'autres syntaxes j'ai essayé celle-ci :
template <int ROWS, int COLS, T>
void Matrix<ROWS, COLS, float>::setIdentity()
{
}
Bonjour,
Je débute un peu en C++ et notamment pour ce qui concerne les templates.
Je me base sur la documentation que je trouve sur internet pour me former
(notamment http://www.cplusplus.com).
Aujourd'hui, j'ai un problème que je n'arrive pas à résoudre malgré mes
recherches.
Je crée une classe template Matrix qui doit me servir à manipuler des
matrices, ainsi :
templace<int COLS, int ROWS, class T = float>
class Matrix
{
private:
std::vector<T> mData;
public:
// plusieurs méthodes
// ...
// la méthode qui me pose problème :
void setIdentity();
};
T est là pour permettre de choisir entre float et double, idéalement
j'aurais préféré m'en passer, car il n'y a pas vraiment d'intérêt
(mathématique) à manipuler des matrices de TrucMuches ou autres types
exotiques.
La méthode setIdentity() ne peut fonctionner que lorsque T est float ou
double. Elle initialise toutes les données de mon vector à 0.0 sauf la
diagonale qui est initialisée à 1.
De plus ROWS et COLS doivent être égaux (matrice carrée).
Par exemple pour une Matrix<2, 2, float>, setIdentity ferait cela :
for(unsigned y = 0; y < ROWS; y++)
{
for(unsigned x = 0; x < COLS; x++)
{
if(x == y) mData[x + y * COLS] = 1.0f;
else mData[x + y * COLS] = 0.0f;
}
}
Je voudrais que pour le cas où T n'est ni float ni double cette méthode ne
fasse rien, et pour le cas de float elle utilise 1.0f et 0.0f alors que
pour double elle utiliserait 1.0 et 0.0.
Je pensais spécialiser cette méthode pour cela, mais je ne trouve pas la
bonne syntaxe.
Parmi tant d'autres syntaxes j'ai essayé celle-ci :
template <int ROWS, int COLS, T>
void Matrix<ROWS, COLS, float>::setIdentity()
{
}
la syntaxe correcte est :
template <int ROWS, int COLS> // pas de T !
void Matrix<ROWS, COLS, float>::setIdentity()
{
//....
}
la syntaxe correcte est :
template <int ROWS, int COLS> // pas de T !
void Matrix<ROWS, COLS, float>::setIdentity()
{
//....
}
la syntaxe correcte est :
template <int ROWS, int COLS> // pas de T !
void Matrix<ROWS, COLS, float>::setIdentity()
{
//....
}
template<int COLS, int ROWS, class T = float>
for(unsigned y = 0; y < ROWS; y++)
méthode
Je voudrais que pour le cas où T n'est ni float ni double cette méthode
ne fasse rien,
et pour le cas de float elle utilise 1.0f et 0.0f alors
que pour double elle utiliserait 1.0 et 0.0.
template<int COLS, int ROWS, class T = float>
for(unsigned y = 0; y < ROWS; y++)
méthode
Je voudrais que pour le cas où T n'est ni float ni double cette méthode
ne fasse rien,
et pour le cas de float elle utilise 1.0f et 0.0f alors
que pour double elle utiliserait 1.0 et 0.0.
template<int COLS, int ROWS, class T = float>
for(unsigned y = 0; y < ROWS; y++)
méthode
Je voudrais que pour le cas où T n'est ni float ni double cette méthode
ne fasse rien,
et pour le cas de float elle utilise 1.0f et 0.0f alors
que pour double elle utiliserait 1.0 et 0.0.
Ici, tu as tout ce qu'il te faut :
- La fonction n'est définie que pour une matrice carrée ;
- Si le type T n'est pas un type numérique, assigner 1 donnera une
erreur de compilation.
Bien sûr, il faut que tu aies une fonction membre Matrix::SetValeur().
Ici, tu as tout ce qu'il te faut :
- La fonction n'est définie que pour une matrice carrée ;
- Si le type T n'est pas un type numérique, assigner 1 donnera une
erreur de compilation.
Bien sûr, il faut que tu aies une fonction membre Matrix::SetValeur().
Ici, tu as tout ce qu'il te faut :
- La fonction n'est définie que pour une matrice carrée ;
- Si le type T n'est pas un type numérique, assigner 1 donnera une
erreur de compilation.
Bien sûr, il faut que tu aies une fonction membre Matrix::SetValeur().
Ce qui me chifonne c'est d'avoir plein de fonctions libres, je n'aime
pas beaucoup.
Ce qui me chifonne c'est d'avoir plein de fonctions libres, je n'aime
pas beaucoup.
Ce qui me chifonne c'est d'avoir plein de fonctions libres, je n'aime
pas beaucoup.
On Sun, 21 Aug 2011 14:48:03 +0200, flure:Ce qui me chifonne c'est d'avoir plein de fonctions libres, je n'aime
pas beaucoup.
Tu viens de Java, non ?
Je te conseille la lecture de cette page :
http://www.gotw.ca/gotw/084.htm
On Sun, 21 Aug 2011 14:48:03 +0200, flure<flure@geeknroll.com>:
Ce qui me chifonne c'est d'avoir plein de fonctions libres, je n'aime
pas beaucoup.
Tu viens de Java, non ?
Je te conseille la lecture de cette page :
http://www.gotw.ca/gotw/084.htm
On Sun, 21 Aug 2011 14:48:03 +0200, flure:Ce qui me chifonne c'est d'avoir plein de fonctions libres, je n'aime
pas beaucoup.
Tu viens de Java, non ?
Je te conseille la lecture de cette page :
http://www.gotw.ca/gotw/084.htm
donc c'est quand même un peu difficile de déterminer ce qui
doit être sorti de la classe et ce qui doit y rester.
En fait dans l'idéal j'aurais préféré limiter l'utilisation de cette
classe aux types float et double. Je n'arrive pas à imaginer du calcul
matriciel sur autre chose
Il faut savoir aussi que je crée cette classe dans le cadre du
développement d'un moteur 3D (oui je n'en suis qu'aux prémisses), donc
de toute façon seuls float et double seront nécessaires.
Bien sûr je pourrais prendre une classe de matrices toute faite, c'est
très facile à trouver sur le net puisque des tas de gens l'ont déjà
faite, mais je me casse la tête sur ce problème aussi dans un but
pédagogique. Les templates m'ont longtemps fait un peu peur, alors j'ai
décidé de les affronter ;)
donc c'est quand même un peu difficile de déterminer ce qui
doit être sorti de la classe et ce qui doit y rester.
En fait dans l'idéal j'aurais préféré limiter l'utilisation de cette
classe aux types float et double. Je n'arrive pas à imaginer du calcul
matriciel sur autre chose
Il faut savoir aussi que je crée cette classe dans le cadre du
développement d'un moteur 3D (oui je n'en suis qu'aux prémisses), donc
de toute façon seuls float et double seront nécessaires.
Bien sûr je pourrais prendre une classe de matrices toute faite, c'est
très facile à trouver sur le net puisque des tas de gens l'ont déjà
faite, mais je me casse la tête sur ce problème aussi dans un but
pédagogique. Les templates m'ont longtemps fait un peu peur, alors j'ai
décidé de les affronter ;)
donc c'est quand même un peu difficile de déterminer ce qui
doit être sorti de la classe et ce qui doit y rester.
En fait dans l'idéal j'aurais préféré limiter l'utilisation de cette
classe aux types float et double. Je n'arrive pas à imaginer du calcul
matriciel sur autre chose
Il faut savoir aussi que je crée cette classe dans le cadre du
développement d'un moteur 3D (oui je n'en suis qu'aux prémisses), donc
de toute façon seuls float et double seront nécessaires.
Bien sûr je pourrais prendre une classe de matrices toute faite, c'est
très facile à trouver sur le net puisque des tas de gens l'ont déjà
faite, mais je me casse la tête sur ce problème aussi dans un but
pédagogique. Les templates m'ont longtemps fait un peu peur, alors j'ai
décidé de les affronter ;)
On Sun, 21 Aug 2011 15:26:57 +0200, flure :donc c'est quand même un peu difficile de déterminer ce qui
doit être sorti de la classe et ce qui doit y rester.
C'est au contraire très simple : si tu peux écrire ta fonction en tant
que fonction libre (i.e. tu n'as pas besoin d'accéder directement aux
données membres ou aux fonctions privées), il faut le faire.En fait dans l'idéal j'aurais préféré limiter l'utilisation de cette
classe aux types float et double. Je n'arrive pas à imaginer du calcul
matriciel sur autre chose
Ben... par exemple, long double. Ou bien, complex<double>.
Certains calculs sur des matrices d'entiers ont aussi du sens.
Si mes souvenirs sont bons, j'ai aussi fait du calcul matriciel sur
des polynômes.
La question est surtout : en quoi est-ce gênant que la classe
fonctionne sur autre chose que des double ou des float ?Il faut savoir aussi que je crée cette classe dans le cadre du
développement d'un moteur 3D (oui je n'en suis qu'aux prémisses), donc
de toute façon seuls float et double seront nécessaires.
Es-tu absolument sûr que ta classe ne te servira pas pour autre chose
un jour ?
Passer du temps à généraliser la classe est contre-productif ; en
revanche, décider que ta classe ne doit pas être utilisée avec int
"parce que c'est comme ça, na !" n'est pas la meilleure approche AMHA.Bien sûr je pourrais prendre une classe de matrices toute faite, c'est
très facile à trouver sur le net puisque des tas de gens l'ont déjà
faite, mais je me casse la tête sur ce problème aussi dans un but
pédagogique. Les templates m'ont longtemps fait un peu peur, alors j'ai
décidé de les affronter ;)
Le conseil habituel : crée ta propre classe, puis, quand elle est
terminée, jette le code et prends une bibliothèque toute faite.
On Sun, 21 Aug 2011 15:26:57 +0200, flure <flure@geeknroll.com>:
donc c'est quand même un peu difficile de déterminer ce qui
doit être sorti de la classe et ce qui doit y rester.
C'est au contraire très simple : si tu peux écrire ta fonction en tant
que fonction libre (i.e. tu n'as pas besoin d'accéder directement aux
données membres ou aux fonctions privées), il faut le faire.
En fait dans l'idéal j'aurais préféré limiter l'utilisation de cette
classe aux types float et double. Je n'arrive pas à imaginer du calcul
matriciel sur autre chose
Ben... par exemple, long double. Ou bien, complex<double>.
Certains calculs sur des matrices d'entiers ont aussi du sens.
Si mes souvenirs sont bons, j'ai aussi fait du calcul matriciel sur
des polynômes.
La question est surtout : en quoi est-ce gênant que la classe
fonctionne sur autre chose que des double ou des float ?
Il faut savoir aussi que je crée cette classe dans le cadre du
développement d'un moteur 3D (oui je n'en suis qu'aux prémisses), donc
de toute façon seuls float et double seront nécessaires.
Es-tu absolument sûr que ta classe ne te servira pas pour autre chose
un jour ?
Passer du temps à généraliser la classe est contre-productif ; en
revanche, décider que ta classe ne doit pas être utilisée avec int
"parce que c'est comme ça, na !" n'est pas la meilleure approche AMHA.
Bien sûr je pourrais prendre une classe de matrices toute faite, c'est
très facile à trouver sur le net puisque des tas de gens l'ont déjà
faite, mais je me casse la tête sur ce problème aussi dans un but
pédagogique. Les templates m'ont longtemps fait un peu peur, alors j'ai
décidé de les affronter ;)
Le conseil habituel : crée ta propre classe, puis, quand elle est
terminée, jette le code et prends une bibliothèque toute faite.
On Sun, 21 Aug 2011 15:26:57 +0200, flure :donc c'est quand même un peu difficile de déterminer ce qui
doit être sorti de la classe et ce qui doit y rester.
C'est au contraire très simple : si tu peux écrire ta fonction en tant
que fonction libre (i.e. tu n'as pas besoin d'accéder directement aux
données membres ou aux fonctions privées), il faut le faire.En fait dans l'idéal j'aurais préféré limiter l'utilisation de cette
classe aux types float et double. Je n'arrive pas à imaginer du calcul
matriciel sur autre chose
Ben... par exemple, long double. Ou bien, complex<double>.
Certains calculs sur des matrices d'entiers ont aussi du sens.
Si mes souvenirs sont bons, j'ai aussi fait du calcul matriciel sur
des polynômes.
La question est surtout : en quoi est-ce gênant que la classe
fonctionne sur autre chose que des double ou des float ?Il faut savoir aussi que je crée cette classe dans le cadre du
développement d'un moteur 3D (oui je n'en suis qu'aux prémisses), donc
de toute façon seuls float et double seront nécessaires.
Es-tu absolument sûr que ta classe ne te servira pas pour autre chose
un jour ?
Passer du temps à généraliser la classe est contre-productif ; en
revanche, décider que ta classe ne doit pas être utilisée avec int
"parce que c'est comme ça, na !" n'est pas la meilleure approche AMHA.Bien sûr je pourrais prendre une classe de matrices toute faite, c'est
très facile à trouver sur le net puisque des tas de gens l'ont déjà
faite, mais je me casse la tête sur ce problème aussi dans un but
pédagogique. Les templates m'ont longtemps fait un peu peur, alors j'ai
décidé de les affronter ;)
Le conseil habituel : crée ta propre classe, puis, quand elle est
terminée, jette le code et prends une bibliothèque toute faite.
Vouloir refaire une classe Matrice soi-même pour apprendre les templates
en C++ n'est pas une bonne idée car, justement, on cherche à réutiliser
au maximum ce qui existe.
Il vaudrait mieux prendre des classes génériques plus originales
Vouloir refaire une classe Matrice soi-même pour apprendre les templates
en C++ n'est pas une bonne idée car, justement, on cherche à réutiliser
au maximum ce qui existe.
Il vaudrait mieux prendre des classes génériques plus originales
Vouloir refaire une classe Matrice soi-même pour apprendre les templates
en C++ n'est pas une bonne idée car, justement, on cherche à réutiliser
au maximum ce qui existe.
Il vaudrait mieux prendre des classes génériques plus originales
En fait dans l'idéal j'aurais préféré limiter l'utilisation de cette
classe aux types float et double. Je n'arrive pas à imaginer du calcul
matriciel sur autre chose
Ben... par exemple, long double. Ou bien, complex<double>.
Certains calculs sur des matrices d'entiers ont aussi du sens.
Si mes souvenirs sont bons, j'ai aussi fait du calcul matriciel sur
des polynômes.
Es-tu absolument sûr que ta classe ne te servira pas pour autre chose
un jour ?
Passer du temps à généraliser la classe est contre-productif ; en
revanche, décider que ta classe ne doit pas être utilisée avec int
"parce que c'est comme ça, na !" n'est pas la meilleure approche AMHA.
Le conseil habituel : crée ta propre classe, puis, quand elle est
terminée, jette le code et prends une bibliothèque toute faite.
En fait dans l'idéal j'aurais préféré limiter l'utilisation de cette
classe aux types float et double. Je n'arrive pas à imaginer du calcul
matriciel sur autre chose
Ben... par exemple, long double. Ou bien, complex<double>.
Certains calculs sur des matrices d'entiers ont aussi du sens.
Si mes souvenirs sont bons, j'ai aussi fait du calcul matriciel sur
des polynômes.
Es-tu absolument sûr que ta classe ne te servira pas pour autre chose
un jour ?
Passer du temps à généraliser la classe est contre-productif ; en
revanche, décider que ta classe ne doit pas être utilisée avec int
"parce que c'est comme ça, na !" n'est pas la meilleure approche AMHA.
Le conseil habituel : crée ta propre classe, puis, quand elle est
terminée, jette le code et prends une bibliothèque toute faite.
En fait dans l'idéal j'aurais préféré limiter l'utilisation de cette
classe aux types float et double. Je n'arrive pas à imaginer du calcul
matriciel sur autre chose
Ben... par exemple, long double. Ou bien, complex<double>.
Certains calculs sur des matrices d'entiers ont aussi du sens.
Si mes souvenirs sont bons, j'ai aussi fait du calcul matriciel sur
des polynômes.
Es-tu absolument sûr que ta classe ne te servira pas pour autre chose
un jour ?
Passer du temps à généraliser la classe est contre-productif ; en
revanche, décider que ta classe ne doit pas être utilisée avec int
"parce que c'est comme ça, na !" n'est pas la meilleure approche AMHA.
Le conseil habituel : crée ta propre classe, puis, quand elle est
terminée, jette le code et prends une bibliothèque toute faite.