为什么C++不能更容易对类型进行编译时查询?

Raj*_*aja 9 c++ templates generic-programming sfinae c++11

我刚开始学习模板元编程技巧,可以让你查询一个类型.

例如,SFINAE允许我们通过使用重载和返回类型sizeof比较来检查类型在编译时是否具有特定的typedef或函数.

问:那么,为什么不(如果有更好的方法在C++ 11/14中纠正我)语言提供更好的机制/接口来进行关于类型的这些查询?

编辑:我想澄清一下,这不是一个咆哮(如果听起来那么我很抱歉).由于我只是开始欣赏模板的强大功能,我想确保我的思维过程不会搞砸.

对于我想要进行这些查询的每个模板类/函数,我必须创建一个SFINAE特定版本.请问编译器"T是否有成员调用A"或"T是否具有函数<return type> (arg list)" 的单个接口不是更清晰的方式吗?当然,编译器具有与用户定义类型相关的所有知识 - 它只需要将其公开给程序员以进行编译时查询.

问:依靠这种通用功能是设计/思考模板的一种糟糕方式吗?如果是这种情况,请说明您的理由(如果可能的话,使用可以完成任务的示例).

Mat*_*lia 8

模板元编程,SFINAE技巧和合作.实际上并不是为了做这件事而设计的.发现了C++中的模板元编程.

模板启动就像编写类型通用代码一样,添加了更多功能来覆盖极端情况(SFINAE的诞生是为了避免在同一程序中提取不相关模板时可能发生的编译器错误),然后有一天有人发现了C++模板提供了图灵完备的元语言,允许执行有关类型的查询,在编译时执行计算等.

因此,C++中的模板元编程难以理解,难以编写,难以调试,编译很悲惨,因为它主要是滥用其他用法的东西.模板恰好是如此强大,但实际上并没有为此设计它们.

C++ 11为这种用法提供了一些库支持(以及一些核心语言支持),但这并没有改变这种情况的本质.

此外,如果你想要我的意见,模板元编程目前被严重滥用; 有了它你可以建立像Boost.Spirit这样的怪物,但你可能不应该.