Chi*_*idi 4 c++ lambda overloading
我正在定义一个这样的类:
class foo {
public:
// I define const and non-const versions of the 'visit' function
// nb. the lambda is passed by reference
virtual void visitWith(std::function<void(foo&)>&);
virtual void visitWith(std::function<void(const foo&)>&) const;
};
Run Code Online (Sandbox Code Playgroud)
foo 可以有孩子,所以我们的想法是递归访问 foo 和所有它的孩子。
当我尝试使用它时,例如。像这样:
foo f;
f.visitWith([&](const foo&) {
// Do something here
});
Run Code Online (Sandbox Code Playgroud)
我收到编译器错误。编译器不知道该怎么做。
我可以通过添加这样的类型转换来使它工作:
foo f;
f.visitWith( (std::function<void(const foo&)>) [&](const foo&) {
// Do something here
});
Run Code Online (Sandbox Code Playgroud)
但这太可怕了。
我怎样才能让它整齐地工作?
编辑:
这可能是 Visual C++ 的问题,它拒绝编译此处给出的代码:
我尝试编译时的 VC++ 输出是:
Edit2:不,Visual C++ 是正确的,代码不明确。请参阅下面的我的解决方案...
lambda 是编译器生成的类型,它不是 的实例std::function,但可以分配给一个。
您的visitWith()方法需要一个std::functionby 非常量引用,这意味着它需要一个预先存在的std::function对象,例如:
std::function<void(const foo&)> func = [&](const foo&) {
// Do something here
};
foo f;
f.visitWith(func);
Run Code Online (Sandbox Code Playgroud)
将 lambda 直接传递给visitWith()需要编译器创建一个临时std::function对象,但非常量引用不能绑定到临时对象。这就是您的原始代码无法编译的原因。
对于您正在尝试的内容,您必须std::function通过值或常量引用传递:
class foo {
public:
void visitWith(std::function<void(foo&)>);
void visitWith(std::function<void(const foo&)>) const;
};
Run Code Online (Sandbox Code Playgroud)
class foo {
public:
void visitWith(const std::function<void(foo&)> &);
void visitWith(const std::function<void(const foo&)> &) const;
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |