我试图用数字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
采用const-reference,并且因为int重载不是const,所以它不会调用它。当我将重载更改为const限定,并且我不修改number
时,程序可以工作(当然没有正确填充数组)。有没有解决的办法?我知道我可以使用for循环来填充数组,但我也在讨论其他带有const引用的STL函数。
答案 0 :(得分:4)
如果您的问题是关于是否可以强制STL算法在const
引用传递的对象上调用非const
成员函数,答案就是您不能。
一种解决方法是将number
标记为mutable
成员。然后允许const
成员函数对其进行修改。
但是,我建议你在做这类事之前要仔细考虑。该函数可能有一个很好的理由采用const
引用。在std::fill
的情况下,标准实际上没有指定必须以任何特定顺序填充范围。如果你传入的东西在每次被调用时会产生不同的int
值,那么就不能保证你得到1 2 3 4
......但是如果你传入了一些不使用任何技巧的东西这个,那顺序是什么并不重要,你总能得到相同的结果。
正如我在评论中指出的那样,std::iota
是你在这种情况下应该使用的。在更一般的情况下,您需要std::generate
,它通过调用按值传递的函数对象来填充范围。
答案 1 :(得分:1)
您可以使用的一个选项是将number
限定为mutable
。
mutable int number = 1;
然后你可以使用:
operator int() const {
return number++;
}
但是,正如评论中所建议的那样,最好使用std::iota
。