【发布时间】:2015-11-03 22:36:07
【问题描述】:
我正在尝试了解类型擦除技术,正如 here 所讨论的并在 adobe::poly 和 Boost::TypeErasure 中实现。不幸的是,我似乎缺少对占位符的基本理解;我目前正在努力从 boost 文档 (here) 中理解以下代码:
std::vector<int> vec;
any<has_push_back<_self, int>, _self&> c(vec);
我的问题如下:
1) 我相信我已经看到了几个占位符的例子——在 lambdas、Boost MPL 等中。似乎有一个约定用前导下划线来指定这些。我的理解是,根据标准,带有前导下划线的标识符是保留的,至少在文件/全局范围内。如果这是正确的,则表明占位符是在某处定义的。那么“_self”占位符在哪里以及如何定义呢? (我在库中看到了一个声明,但仅此而已 - 没有实现。这就是所有需要的吗?)
2) 据推测,每个库都定义了它们的占位符——但它们的名称通常相同(例如,“_1”、“_2”……)。因此,当在翻译单元中同时使用多个库时,开发人员通常需要明确限定用法以避免歧义/冲突?或者 ADL 是否以某种方式缓解了这种情况?最好的做法是明确限定占位符,还是避免这样做以避免过多的“语法噪音”?
3) 在上面的代码中,在“any”的实例化过程中,“_self”似乎被替换为 std::vector。这是从这个变量声明/初始化语句中隐含地推导出来的吗? (也许通过 ctor 模板???)如果不是,这是如何工作的?
4) 这些占位符是否总是为模板参数键入说明符?这是元编程/lambda 源库中常见的规范用法吗?
提前感谢您对此的看法!
【问题讨论】:
-
标准保留有两个下划线 (
__) 或以一个下划线和一个大写字母 (_A) 开头的名称。se__lf和_Self保留,但_self不保留。 -
命名空间...命名空间
-
每个问题一个问题!