gpt4 book ai didi

c++ - 使 std::fill 调用非 const 限定运算符重载

转载 作者:行者123 更新时间:2023-11-30 01:11:34 26 4
gpt4 key购买 nike

我试图用数字 1 - 100 填充一个数组。我使用了 std::fill。现在,std::fill 的最后一个参数是填充范围的数字。我想我可以聪明一点,传入一个具有 int 重载的对象,这样当它分配范围元素时,它也会自动增加对象中的数字。

class AutoInc {

public:

operator int() {
number++;
return number - 1;
}

int number = 1;

};

...以及以下对 std::fill 的调用:

int numbers[100];
std::fill(numbers, numbers + 99, (AutoInc());

它抛出一个错误,说它找不到 AutoInc 的 int 重载。这是因为 std::fill 采用常量引用,并且因为 int 重载不是常量,所以它不会调用它。当我将重载更改为 const 限定,并且我不修改 number 时,程序运行(当然没有正确填充数组)。有没有解决的办法?我知道我可以使用 for 循环来填充数组,但我说的是其他采用常量引用的 STL 函数。

最佳答案

如果您的问题真的是关于您是否可以强制 STL 算法在通过 const 引用传递的对象上调用非 const 成员函数,答案很简单,您不能.

一种解决方法是将 number 标记为 mutable 成员。然后一个 const 成员函数将被允许修改它。

但是,我建议您在做此类事情之前仔细考虑。该函数采用 const 引用可能有充分的理由。在 std::fill 的情况下,标准实际上并未指定必须以任何特定顺序填充范围。如果你传入的东西每次被调用时都会产生不同的 int 值,那么就不能保证你得到 1 2 3 4 ...但是如果你传入不使用任何此类技巧的东西,那么顺序是什么并不重要,您总是会得到相同的结果。

正如我在评论中指出的那样,std::iota 是您在这种情况下应该使用的。在更一般的情况下,您需要 std::generate,它通过调用按值传递的函数对象来填充范围。

关于c++ - 使 std::fill 调用非 const 限定运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35950136/

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