首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ -占位符如何工作(特别是在boost::type_erasure中)?

C++ -占位符如何工作(特别是在boost::type_erasure中)?
EN

Stack Overflow用户
提问于 2015-11-03 22:36:07
回答 1查看 1K关注 0票数 3

我试图了解类型擦除技术,正如讨论的这里和在adobe::poly::TypeErasure中实现的。不幸的是,我似乎缺少了对占位符的基本理解;我目前很难理解boost文档(这里)中的以下代码:

代码语言:javascript
复制
std::vector<int> vec;
any<has_push_back<_self, int>, _self&> c(vec);

我的问题如下:

1)我相信我已经看到了几个占位符的例子-在lambdas,Boost MPL,等等。似乎有一种用前导下划线来指定这些占位符的惯例。我的理解是,根据标准,保留带前导下划线的标识符,至少在文件/全局范围内是这样。如果这是正确的,那就意味着占位符是在某个地方定义的。那么,“_self”占位符在哪里以及如何定义呢?(我在库中看到了一个声明,但仅此而已-没有实现。这就够了吗?)

2)想必,每个库都定义了它们的占位符--但它们的名称通常是相同的(例如,“_1”、“_2”、…)。因此,当在翻译单元中同时使用多个库时,开发人员通常需要显式限定使用,以避免歧义/冲突?或者ADL在某种程度上减轻了这一点?明确限定占位符是最好的做法,还是避免过多的“句法噪音”?

3)在上面的代码中,在“any”的实例化过程中,似乎用std::_self代替了“_self”。这是从这个变量声明/初始化语句中隐式推导出来的吗?(也许是通过ctor模板??)如果没有,这是如何工作的?

4)这些占位符是否总是为模板参数键入说明符?这是元编程/lambda源代码库中常见的规范用法吗?

提前感谢您对此的思考!

EN

回答 1

Stack Overflow用户

发布于 2015-11-04 20:21:38

一般来说,占位符是模板元编程中可以“打开”的唯一类型。

通常,当有多个相同“类别”的占位符时,它们是相关的,例如:

代码语言:javascript
复制
template <int N>
struct my_placeholder_t {
    enum { value = N };
};

typedef my_placeholder_t<0> _0;
typedef my_placeholder_t<1> _1;
typedef my_placeholder_t<2> _2;
...

这种关系只会使为一般情况编写代码变得更容易,但对于最终用户来说并不重要:

代码语言:javascript
复制
typedef /*implementation-defined*/ _0;
typedef /*implementation-defined*/ _1;
typedef /*implementation-defined*/ _2;
...

实现将在稍后阶段使用占位符。占位符通常以一种类型编码:

代码语言:javascript
复制
auto et = foo(_2, _1);

将产生一个例如template_expr<something, ..., my_placeholder_t<2>, my_placeholder_t<1>> (参见表达式模板)的对象。

在稍后阶段,这些类型将被“解释”,例如当你这样做时:

do_action(et,make_tuple(“忽略!”,“某样东西”,42));

do_action的实现可以解释占位符以从元组中获取它们对应的元素,例如,这就是bind库函数(std::bind,boost::bind,boost::lambda::bind::mpl:bind,boost::mpl::bind.)所有的人都会这样。

在Boost TypeErasure中,占位符_self主要用于在成员函数概念规范中指定this参数的限定。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33510392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档