gpt4 book ai didi

c++ - 在 for 循环中声明两个不同的变量,其中一个是不可移动、不可复制的对象

转载 作者:行者123 更新时间:2023-11-30 00:35:32 24 4
gpt4 key购买 nike

我知道在带有 std::pair 的 for 循环中声明和初始化两个不同的变量或匿名 struct类型,但是 these不要为我的目的工作。

假设我有以下类定义

class Object {
private:
int i;
public:
Object(int i) : i(i) { }
// everything else deleted
Object() = delete;
Object(const Object &) = delete;
Object(Object &&) = delete;
Object & operator=(const Object &) = delete;
Object & operator=(Object &&) = delete;
};

有什么方法可以初始化 Object和一个 intfor循环线。我不想在 for 循环或类似的东西周围添加额外的 block 。我对 std::tuple 没问题, std::pair , 匿名 structs , 无论如何,只要它有形式

for(/* creates Object and int*/ ; /*whatever*/; /*whatever*/) { /* ... */}

或(如果语法存在)

for( Object o(69), int i = 0; i < 10; ++i) { /* ... */ }

我不想要的是一个额外的named 类定义。我已经想出了这个:

for(class Container : private Object {
public:
int value;
Container(int i) : Object(i), value(0) { }
} container(69); /* ... */ ;
container.value < 10;
++container.value) { /* ... */}

但是类名Container然后在 for 循环内部变得可见,我试图避免这种情况。

我的实际使用是 std::lock_guard<std::mutex>和一个 bool , 以便在退出循环后释放互斥量。

最佳答案

你可以使用 piecewise construction调用构造函数:

for (std::pair<Object, int> x (std::piecewise_construct,
std::make_tuple(69),
std::make_tuple(0));
x.second < 10; x.second ++) {

std::cout << x.first.i << "/" << x.second << std::endl;
x.first.i += 4;
}

不幸的是,这并不能推广到元组。 std::tuple 没有分段构造函数。


不知道你为什么忽视它,但我发现与更直接的实现相比,“配对”解决方案非常丑陋

{
Object o (69);
for (int i = 0; i < 10; ++ i) {
std::cout << o.i << "/" << i;
o.i += i;
}
}

关于c++ - 在 for 循环中声明两个不同的变量,其中一个是不可移动、不可复制的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18725904/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com