小编Gle*_*leb的帖子

如何将std :: array转换为std :: tuple?

我正在研究一个aux模块,以在多态对象之间传递值,有时

std::array<void*, N>
Run Code Online (Sandbox Code Playgroud)

并且需要转发

std::tuple<void*, void*, /* N times */>
Run Code Online (Sandbox Code Playgroud)

我可以使用index_sequence或/和递归来找到一些解决方案,但是所有这些看起来都很笨重并且难以阅读。
通过标准库,还有其他更直接的方法吗?

另外,以防万一-我是对的吗,布局std::array是一组密集的各个对象,因此等于void**各个长度,而元组的布局允许有间隙?

c++ arrays tuples

11
推荐指数
1
解决办法
229
查看次数

从标准容器中移动元素是否合法?

我正在编写一个类,该类需要用于过滤成员容器的高效函数(可以说std::vector)。此功能应具有类似于以下内容的界面:

void filter(std::vector<SomeType>& items, const std::vector<int>& inds);
Run Code Online (Sandbox Code Playgroud)

该函数应使容器items处于以下状态:-索引所指向的项目inds应被删除-其他项目应保留在容器中并保持初始顺序。

为简单起见,假设这inds是一个完美的容器,每个操作均带有O(1),并且所有索引均有效且无重复。

我的想法是创建第二个容器,保留所需的空间,然后将std::move所有未索引的元素(通过)移动inds到该新容器中;然后只需交换旧容器和新容器即可。

例如这样:

void filter(std::vector<SomeType>& items, const std::vector<int>& inds)
{
    std::vector<SomeType> new_items{};
    new_items.reserve( items.size() - inds.size() );

    for(size_t i = 0; i < items.size(); ++i)
        if( contains( inds, i ) ) // magic O(1) function, never mind
            new_items.push_back( std::move( items[i] ) );

    items.swap(new_items);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

1)在(或其他标准容器)std::move内部的某个元素上使用后,vector是否会出现诸如双重破坏这些元素的问题?

2)是否有标准方法可以有效地进行此类过滤?

c++ containers stdmove

3
推荐指数
1
解决办法
112
查看次数

是否可以使用参数包而不是嵌套模板序列?

Hy,我正在制作一些元编程库,可以帮助从简单的ad-mixture类到继承构建复杂的对象.

例如,我得到了一些产生一组模板类的机制,每个模板类代表一个属性.

我来到了最终的构建过程,看起来像这样:

class Car : public Position< Size< Color< BaseObj<Car> > > > {/*...*/};
Run Code Online (Sandbox Code Playgroud)

我完全不喜欢它.
(BaseObj始终是序列中最内层的模板)

我尝试制作一些处理模板,以便能够像这样写:

class Car : public Proc< Position, Size, Color, Car > {/*...*/};
Run Code Online (Sandbox Code Playgroud)

但没有成功.

是否可以制作这样的模板?
是否有任何其他更易读的语义可以与一系列这样的嵌套模板具有相同的效果?

c++ templates template-meta-programming

2
推荐指数
1
解决办法
64
查看次数