2017-10-06 7 views
0

Remarque, je suis au courant de this question, mais ce que je veux est différent.Définition de main() via un modèle

Mon code actuel (la somme totale de mon main.cpp) ressemble à ce passe-partout standard pour faire une classe dans un fichier exécutable:

#include <MyHeader.h> 
int main(int argc, char **argv) 
{ 
    return MyTemplate<MyClass>(argc, argv); 
} 

Cela fonctionne bien heureusement, mais ce serait encore mieux si je pouvais faire juste:

#include <MyMainWrapper.h> 
// UPDATE: commented out... MyMainWrapper<MyTemplate, MyClass> main; 
MyMainWrapper<MyTemplate, MyClass> someObjectThatGeneratesMain; 

Et cela s'étendrait au code ci-dessus. Il pourrait bien sûr être facilement fait avec une macro, mais je suis intéressé de voir s'il y a une solution de modèle, ou sinon, pourquoi pas?

MISE À JOUR: J'imagine un modèle de fonction qui pourrait en quelque sorte faire:

template<...> 
extern "C" int main(int argc, char **argv) 
{ 
    //... 
} 

Mais je vois que les modèles ne peuvent pas être extern "C".

+0

Je n'arrive pas à comprendre pourquoi vous voudriez coller tout le code dans une seule classe. Quoi qu'il en soit, je ne comprends pas ce que le dernier bloc est censé signifier, vous avez déclaré quelque chose qui s'appelle 'main' et ce n'est clairement pas une définition de fonction, c'est comme une dupe pour moi. –

+0

@PasserBy Il y a un bon nombre d'autres classes cachées derrière le 'MyClass', qui peut soit être instancié de' main() 'pour une opération autonome comme ici, ou utilisé dans une forme de bibliothèque partagée, qui a un modèle différent + méthode de définition de macro. Je sépare les choses afin que je puisse construire la bibliothèque de base une fois, puis relier plusieurs fois avec la forme de bibliothèque partagée et plusieurs secteurs. –

+1

Vous pouvez déclarer la classe et un 'main' vide, exemple:' MyMainWrapper foo; int main() {}; 'le constructeur de' MyMainWrapper' sera appelé. Vous avez toujours besoin d'un point d'entrée. 'main' n'a rien à faire mais il doit être là, ou un autre point d'entrée. –

Répondre

1

Il n'y a pas de solution de modèle, car main est une interface C pure.

Avec toute la décoration ajoutée pour les spécialisations de modèles, l'éditeur de liens n'a aucune chance de savoir exactement ce qui est censé être votre "principal".

#include <MyMainWrapper.h> 
MyMainWrapper<MyTemplate, MyClass> main; 

Ce n'est pas une fonction non plus, il ne correspond pas à la signature requise. Il peut être un appelable, mais c'est du sucre syntaxique ajouté par C++ et ne lie pas.

+0

OK, j'ai essayé d'élargir ce que je demande - en utilisant le nom 'principal' il y a de la confusion, je suis d'accord. (Cela semble impossible, maintenant je l'épelle plus explicitement!) –