我刚刚开始学习允许您查询类型的模板元编程技巧。
例如,SFINAE允许我们在编译时通过重载和返回类型 sizeof 比较来检查类型是否具有特定的 typedef 或函数。
问:那么,为什么(如果 C++11/14 中有更好的方法,请纠正我)语言提供更好的机制/接口(interface)来进行这些关于类型的查询?
编辑:我想澄清一下,这不是咆哮(如果听起来是这样,我很抱歉)。由于我才刚刚开始领略模板的强大功能,所以我想确保我的思维过程没有被打乱。
对于我要进行这些查询的每个模板类/函数,我必须创建一个 SFINAE 特定版本。询问编译器“T 是否有一个名为 A
的成员”或“T 是否有函数 <return type> (arg list)
”的单一接口(interface)不是更简洁的方法吗?编译器当然拥有与用户定义类型相关的所有知识 - 它只需要将其公开给程序员以进行编译时查询。
问: 依赖这种通用功能是否是设计/思考模板的一种糟糕方式?如果是这种情况,请说明您的原因(如果可能,请提供无需查询即可完成任务的示例)。
最佳答案
模板元编程,SFINAE tricks & co。实际上并不是为了做这些事情而设计的。 C++ 中的模板元编程大部分被发现。
模板一开始只是作为编写类型通用代码的手段,后来添加了更多功能来涵盖极端情况(SFINAE 的诞生是为了避免在同一程序中引入不相关的模板时可能发生的编译器错误),然后有一天有人发现C++ 模板提供了一种图灵完备的元语言,允许执行有关类型的查询、在编译时执行计算等。
因此,C++ 中的模板元编程难以理解、难以编写、难以调试、难以编译,因为它主要是对用于其他用途的东西的滥用。模板恰好如此强大,但实际上没有人为此设计它们。
C++11 为这种用法提供了一些库支持(以及一些核心语言支持),但这并没有改变这种情况的本质。
另外,如果你想听听我的意见,模板元编程目前被严重滥用;有了它,您可以构建像 Boost.Spirit 这样的怪物,但您可能不应该这样做。
关于c++ - 为什么 C++ 不能更轻松地对类型进行编译时查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21102154/