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

C++ 主功能可以是模板吗?(安全命令行参数解析),c++,C++,主函数是否可以这样声明: template<typename T1, typename T2> int main(T1 argc, T2 *argv[]) { } 好了,安全的命令行参数解析是我发明了轮子还是什么?原则上,充分利用标准留给实现的空间,您可能会决定允许这样做 不过,我不知道在使用main作为起点时有什么实现会这样做,也不知道这样做的原因 这允许它作为扩展,在发出至少一个诊断后可用: 1.4实施合规性§8 一致性实现可以具有包括附加库函数的扩展,前提是它们不会改变任何格

主函数是否可以这样声明:

template<typename T1, typename T2>
int main(T1 argc, T2 *argv[])
{
}

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

原则上,充分利用标准留给实现的空间,您可能会决定允许这样做


不过,我不知道在使用main作为起点时有什么实现会这样做,也不知道这样做的原因

这允许它作为扩展,在发出至少一个诊断后可用:

1.4实施合规性§8 一致性实现可以具有包括附加库函数的扩展,前提是它们不会改变任何格式良好的程序的行为。根据本国际标准,需要实现来诊断使用这种格式错误的扩展的程序。然而,这样做之后,他们就可以编译和执行这样的程序了

此选项允许它用于独立环境,即使没有诊断:

3.6.1主要功能[基本.启动.主要] 1程序应包含一个名为main的全局函数,该函数是程序的指定起点。独立环境中的程序是否需要定义主功能是由实现定义的。[注意:在独立环境中,启动和终止由实现定义;启动包含对命名空间范围内具有静态存储持续时间的对象执行构造函数;终止包含对具有静态存储持续时间的对象执行析构函数。-结束注]

这:

它实际上是一个函数模板。根据§3.6.1/1,本标准要求main是一个功能:

程序应包含一个名为main的全局函数,该函数是程序的指定起点

就像类和类模板不是一回事一样,函数和函数模板是两件不同的事情。更具体地说,根据§14.1:

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

因此,函数模板可以生成一组潜在的无限函数


†有争议

视情况而定。在我自己的超级秘密和私有独立实现中,如果满足以下所有条件,您可以将主函数设置为模板

函数名为mаa,注意第二个字母是西里尔字母,而不是拉丁字母。 有2个、17个或23个非压缩模板参数,或一个单独的变量压缩。 如果模板参数由一个变量包组成,它是用类而不是typename引入的,类和点之间没有空格,点和包名之间只有一个空格。 这是一个满月,你在北半球,或者你在南半球,火星在地平线之上。不支持没有GPS或ASCOM的编译。
面对提出的问题,所有这些信息显然是完全无用的,但谁在乎呢?至少它提到了独立的实现和语言扩展。

你能想出一个有效的用例吗?你会如何实例化它?@PaulR你能问我一些我在问题中没有提到的问题吗?@PaulR,用例正在问一些模糊的问题@Nikos你打算如何实例化这个模板?这个问题似乎不属于实际的、可回答的问题的要求范围,这些问题在软件开发领域是独一无二的-+1这解释了为什么标准甚至不必提及模板还有一个问题,即main是否可以是从模板实例化的函数。这就是许多忘记在头中内联函数的人发现的函数,并调用了main。Hm.@Jeffrey该标准讨论了名为main的函数的存在性,它将在模板实例化时创建,而不是关于为解析器命名其他符号的限制,无论是模板名还是其他什么,可能存在这样的限制,但是你引用的摘录中肯定没有这些内容。@icepack:一些用户认为不相关的内容。该标准明确了名称查找的工作原理,即特定名称在任何给定上下文中的含义:main必须命名函数,而不是函数模板。在给定的示例中,::main命名了一个模板。模板实例化可能是一个函数,但没有名字。你不知道你可以写非标准C++,它甚至看起来不像C++,你怎么敢不把每个人都需要记住的非常相关的小节包含进去??我不知道有什么实现,也没有理由这么做。如果环境不禁止,这是可行的。我刚刚检查了一个独立于Windows设备驱动程序的环境,编译起来就像一个符咒,main与其他任何函数都没有区别。@icepack:Th
脚踝。在那里,我实际上把我的观点限制在那些使用main作为起点的人身上,这不是必需的。而且它只在PCP上运行。为了幽默,你太有趣了,伙计,哈哈。当编译失败时,这个实现会发出讽刺的掌声吗?如果不是,我可以给你一个。我也应该选择答案,这样每个人都能看到你有多滑稽。如果你在南方的天空下,但看不到火星,你可以简单地颠倒论点的顺序,不尝试,但应该有效。
template<typename... Args>
int main(Args&& ...vs)
{
}
template<typename T1, typename T2>
int main(T1 argc, T2 *argv[])
{
}