2017-09-05 4 views
0

Supposons que j'ai une fonction qui peut prendre un argument optionnel de type template.Eigen: Type par défaut pour MatrixBase dans la fonction de modèle?

template<typename Scalar = int> 
void foo(Scalar *out = NULL) 
{ 
    std::cout << "HI!" << std::endl; 
    if(out != NULL) 
     *out = 42; 
} 

float x = 10; 
foo(&x);//Call with optional argument 
foo();//Call without optional argument 

de compilateur ne peut évidemment pas déduire le type d'argument optionnel de l'appel sans argument optionnel, mais nous pouvons l'aider en spécifiant un argument de modèle par défaut

template<typename Scalar = int> 

Supposons que j'ai maintenant exemple du monde réel avec Eigen

template</*some template args*/, typename Derived> 
void solve(/*some args*/, std::vector<Eigen::MatrixBase<Derived>> *variablePath) 

Ma question est - comment spécifier un type par défaut pour Derived? Par exemple je veux faire le type par défaut de variablePath être std::vector<Eigen::MatrixXf> *

Bien sûr, je peux utiliser un argument de modèle commun au lieu de Eigen::MatrixBase<Derived> par exemple

template</*some template args*/, typename Matrix = Eigen::MatrixXf> 
void solve(/*some args*/, std::vector<Matrix> *variablePath) 

Mais je pense qu'il est assez sale

PS Désolé pour mon anglais

+0

'Eigen :: MatrixBase ' serait la base type de 'Eigen :: MatrixXf', mais vous ne devriez jamais stocker en valeur tout objet' MatrixBase'. – chtz

+0

@chtz donc si j'utilise Eigen :: MatrixXf comme valeur par défaut pour Derived et je ne créerai jamais de variable de type 'Eigen :: MatrixBase ' tout ira bien? –

+0

Ça devrait aller, mais je ne pense pas que vous serez capable de créer n'importe quel 'std :: vector >' de n'importe quoi (à moins que vous ne vous tiriez intentionnellement dans le pied). Peut-être juste le modéliser à 'std :: vector >' (et plus d'arguments de modèle, si nécessaire) – chtz

Répondre

1

Je suppose que vous voulez aussi par défaut variablePath à nullptr, donc il suffit d'écrire une surcharge sans l'argument optionnel:

template</*some template args*/, typename MatType> 
void solve(/*some args*/, std::vector<MatType> *variablePath); 

template</*some template args*/> 
void solve(/*some args*/) { 
    std::vector<MatrixXf> *nullvector = nullptr; 
    solve(/*some args*/, nullvector); 
}