Je travaille avec la classe Matrix modélisée dans la bibliothèque Eigen linear algebra (link). La classe Matrix prend trois paramètres de modèle nominaux:Utilisation de l'instruction conditionnelle pour sélectionner une classe de matrice différente au moment de l'exécution
Matrix<type, rows, cols>
Dans ce qui précède, un exemple de type
est double
ou std::complex<double>
. En outre, rows
est le nombre de lignes et cols
est le nombre de colonnes dans la matrice.
Comme le montre le code ci-dessous, ce que je voudrais faire est d'utiliser une classe Matrix différente lors de l'exécution en utilisant une instruction conditionnelle.
La première solution qui vient à l'esprit pourrait être d'utiliser des pointeurs de vide.
#include <iostream>
#include <Eigen/Dense>
#include <complex>
using namespace Eigen;
int main()
{
// this flag is set at run-time, but it is only set here
// in the code as an example
int create_complex = 1;
void *M;
if(create_complex)
{
Matrix<std::complex<double>,3,3> m0;
M = &m0;
}
else
{
Matrix<double,3,3> m0;
M = &m0;
}
// de-reference pointer here and use it
return 0;
}
Bien que ce code compile, le pointeur void *M
doit être explicitement de-référencé avant utilisation. Ceci est gênant, car je dois alors écrire des blocs de code différents pour la même logique de programme. Je me demande s'il y a quelque chose de similaire au polymorphisme qui pourrait être appliqué ici, où je n'ai pas besoin d'utiliser des pointeurs de vide.
L'indicateur 'create_complex' n'est pas connu au moment de la compilation. J'utilise simplement 'create_complex' comme exemple. –
Cela vous dérange-t-il d'utiliser 'boost :: variant'? J'essaierais très fort d'éviter d'être dans votre situation (peut-être qu'un peu plus de contexte nous aiderait à vous aider), mais si je le devais, j'irais avec. –
@AlexandreC: Bien sûr, je voudrais utiliser 'boost :: variant'. J'ai déjà utilisé la bibliothèque de boost, mais je ne peux pas dire que j'ai entendu parler de ce conteneur en particulier. Cela semble très intéressant. Comment pourrais-je l'utiliser? –