在一个纯const虚成员函数中,我想返回一个lambda供以后使用。lambda稍后会更改对象,但这在函数外部,并且不会破坏成员函数的cv限定符。我如何才能做到这一点?const_cast是一种可能性吗?
发布于 2021-11-11 09:23:50
您可以在lambda中使用const_cast
将this
转换为可变的。
#include <functional>
#include <iostream>
using std::cout;
using std::function;
using std::ostream;
namespace abstract {
struct Foo {
virtual ~Foo() = default;
virtual auto get_remote_control() const -> function<void()> = 0;
};
} // abstract
namespace concrete {
struct Bar : abstract::Foo {
int state = 0;
auto get_remote_control() const -> function<void()> override;
};
static auto operator<<(ostream& out, Bar const& bar) -> ostream& {
return out << bar.state;
};
} // concrete
int main() {
concrete::Bar bar;
abstract::Foo const& foo = bar;
auto remote_control = foo.get_remote_control();
cout << "Before, Bar{" << bar << "}\n";
remote_control();
cout << "After, Bar{" << bar << "}\n";
}
auto concrete::Bar::get_remote_control() const -> function<void()> {
return [this]{ Bar& mut_self = *const_cast<Bar*>(this); ++mut_self.state; };
}
注意事项有:
const
,则后续的++mut_self.state
将是未定义的行为(谢谢您的更正)。未定义的行为可能会导致一个很难找出的错误。function<void()>
对象中的返回的lambda会导致一些overhead.https://stackoverflow.com/questions/69932269
复制相似问题