2017-10-06 3 views
0

注:私はthis questionを認識していますが、私が望むものは異なります。テンプレートを使用してmain()を定義する

私の現在のコード(私のmain.cppの合計)は、実行可能ファイルにクラスを作るために、この標準の決まり文句のようになります。これは非常に喜んで働く

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

、私はやることができればそれも良いだろうちょうど:

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

それは上記のコードに拡張されます。もちろん、マクロで簡単に行うこともできますが、テンプレートソリューションがあるかどうかを確認することに興味があります。

UPDATE:私は何とかするかもしれない関数テンプレートを想像:

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

をしかし、私はテンプレートがextern "C"することができないことがわかります。

+0

なぜ私は1つのクラスにすべてのコードをスティックしたいと思うことはできません。最後のブロックが何を意味するのか分からず、あなたは 'main'と宣言しています。それは明らかに関数の定義ではなく、私の欺瞞のように感じます。 –

+0

@PasserBy 'MyClass'の背後に隠れている数多くのクラスがあります。スタンドアロン操作のために' main() 'からインスタンス化することも、共有ライブラリのフォームで使用することもできます。 +マクロ定義メソッド。コアライブラリを一度構築してから、共有ライブラリフォームと複数のメインとを何度もリンクすることができます。 –

+1

クラスと空の 'main'を宣言できます。例:' MyMainWrapper foo; int main(){}; 'MyMainWrapper'のコンストラクタが呼び出されます。それでもエントリポイントが必要です。 'main'は何もする必要はありませんが、そこに存在しなければなりません。 –

答えて

1

mainは純粋なCインターフェイスなので、テンプレートソリューションはありません。

テンプレートの特殊化のためにすべての装飾が追加されているため、リンカーは正確にあなたの「メイン」であると思われるものを知る機会がありません。

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

これは機能ではないため、必要な署名と一致しません。それは呼び出し可能かもしれませんが、それはC++によって追加された構文的な砂糖であり、リンクしません。

+0

OK、私は何を求めているのかを広げようとしました。「main」という名前を使用すると混乱しますが、私は同意します。 (これは不可能なようですが、今私はそれをもっと明示しています!) –

関連する問題