2017-10-06 71 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'这个名字是令人困惑的,我同意。 (这似乎是不可能的,现在我明确地说出来了!) –