2017-10-06 118 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; 

而這將擴展到上面的代碼。這當然可以很容易地用宏來完成,但我有興趣看看是否有模板解決方案,或者如果沒有,爲什麼不呢?

更新:我想一個函數模板,可能以某種方式做:

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

但我看到的模板不能extern "C"

+0

我無法理解爲什麼你想要把所有的代碼粘到一個類中。儘可能地,我不明白最後一塊應該是什麼意思,你聲明瞭一個名爲'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

好的,我試圖擴展我所要求的 - 使用'main'這個名字是令人困惑的,我同意。 (這似乎是不可能的,現在我明確地說出來了!) –