主要功能可以是模板吗?(安全命令行参数解析)

Nik*_*iou 6 c++

可以像这样声明main函数:

template<typename T1, typename T2>
int main(T1 argc, T2 *argv[])
{
}
Run Code Online (Sandbox Code Playgroud)

对于实例化T1= intT2= char我们最终得到一个共同的签名.

main没有提及模板的限制:

  • 程序中没有其他功能可以称为main

  • main不能定义为内联或静态.

  • 无法从程序中调用C++ main.

  • C++不能采用main的地址.

  • C++主函数不能重载.

显然没有这种语法的应用,但是

  • 有没有一个编译器来实现它?
  • 实施类似的东西是否有任何逻辑障碍

编辑

在我第一次尝试上述问题时,我有点模糊.(正确地)对这个问题有一些否定的评论,所以我应该就要求就这个主题提出反馈做出一些推理:

  • C++是一种不断发展的语言,也许这是实现的,有人意识到它

  • 有人可以告诉我为什么 main它有限制

  • 语言律师可以在标准中找到一个漏洞来允许这样的声明(恰好相反)

  • 模块系统的发展将语言推向了组件分离的逻辑(就目前的编译单元而言).也许这会影响我们生成编译单元的方式,也许main在子模块中定义多个函数,在这种情况下需要更灵活的 main.

模板化的一个示例用例 main

如果标准允许类似的东西(将来)我们可以写

template<typename... Args>
int main(Args&& ...vs)
{
}
Run Code Online (Sandbox Code Playgroud)

你去,安全的命令行参数解析(我发明了轮子还是什么?)

Sho*_*hoe 17

这个:

template<typename T1, typename T2>
int main(T1 argc, T2 *argv[])
{
}
Run Code Online (Sandbox Code Playgroud)

实际上是一个功能模板.根据§3.6.1/ 1,标准要求main是一个功能:

程序应包含一个名为main的全局函数,它是程序的指定开始.

就像类模板不一样,函数函数模板是两回事.更具体地说,根据§14.1:

模板定义类或函数族或类型族的别名.

因此一个功能模板可以"生成"一个潜在的无限一组功能.

†是有争议的

  • @icepack:一些用户认为无关紧要.标准清楚地说明了名称查找的工作原理(即特定名称在任何给定的上下文中的含义).`:: main`必须命名一个函数,而不是函数模板.在给出的示例中,`:: main`命名一个模板.模板实例化可以是一个函数,但没有名称. (8认同)
  • 难道你不知道你可以编写非标准的C++,它甚至可能看起来不像C++你怎么敢不包括你的答案中每个人都需要记住的那个非常相关的小故事? (4认同)
  • 还有一个问题是`main`是否可以是从模板实例化的函数.然后它就是一个"函数"(因为很多人忘记了`inline`一个函数在头文件中发现了),并称为"main".嗯. (3认同)
  • +1这解释了为什么标准甚至不必提及模板 (2认同)
  • @Jefffrey标准讨论了名为"main"的函数的存在(它将在模板实例化时创建),而不是关于为解析器命名其他符号的限制,无论是模板名称还是其他东西(可能有这样的限制,但是他们肯定没有出现在你所引用的摘录中. (2认同)
  • @icepack,我会把它当作没有.再次,并且最后一次:标准说`main`必须是一个函数.如果你将`main`声明为模板函数并将其实例化为,例如,`int main <X,Y>(...);`就像你所做的那样,这并没有改变`main`不是这样的事实一个函数,但一个函数模板.`int main <X,Y>(...)`将是一个有效的函数实例化,但`main <X,Y>`和`main`是两个不同的名称,指的是两个不同的东西,而后者必须是一个功能. (2认同)
  • @Deduplicator:这个问题标记为C++,它意味着标准的C++.我们还有其他扩展标记,例如msvc ++. (2认同)

R. *_*des 16

这取决于.在我自己的超级秘密和私人独立实施中,如果满足以下所有条件,您可以将主要功能设为模板.

  • 该功能已命名m?in(请注意,第二个字母是西里尔字母,而不是拉丁字母).
  • 有2个,17个或23个非包装模板参数,或一个单独的可变参数包.
  • 如果模板参数由一个可变参数包组成,则引入它class,而不是dot-dot-dot typename之间没有空格class,并且dot-dot-dot和包名之间有一个空格.
  • 这是一个满月,你在北半球,或者你在南半球,火星在地平线之上.(不支持没有GPS或ASCOM的编译.)

面对提出的问题,所有这些信息显然都是无用的,但谁在乎呢?至少它提到了独立实现和语言扩展.

  • +1对于幽默,你是如此有趣的老兄哈哈.当编译失败时,此实现是否会发出讽刺性的手写操作?如果没有,我可以给你一个.我也应该选择答案,这样每个人都可以看到你有多有趣. (4认同)
  • 如果你在南方天空下但看不到火星,你可以简单地颠倒参数的顺序,(没有尝试,但应该工作). (3认同)