tom*_*tom 5 c++ rvalue rvalue-reference
我有一个F带有foo不同实现的函数的结构,无论是否F是临时的
struct F{
void foo() & { std::cout << "F::foo() &" << std::endl; }
void foo() && { std::cout << "F::foo() &&" << std::endl; }
};
Run Code Online (Sandbox Code Playgroud)
另一个结构体在其函数调用中A具有 和 的副本。我想使用正确版本的. 因此,实现是:FbarF::fooF::foo()
struct A{
void bar() & {
f.foo();
}
void bar() && {
std::move(f).foo();
}
F f;
};
Run Code Online (Sandbox Code Playgroud)
我想知道我是否真的必须提供A::bar(). 难道没有一种聪明的方法可以std::forward用来自动决定F::foo()应该使用哪个吗?
一次尝试:
struct B{
void bar() {
std::forward<F>(f).foo();
}
F f;
};
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用。它F::foo() &&每次都调用。
您可以使用非成员函数模板:
struct B{
template<typename TB>
friend void bar(TB&& self) {
std::forward<TB>(self).f.foo();
}
F f;
};
Run Code Online (Sandbox Code Playgroud)
根据其他函数参数,您可能希望限制 的类型,TB例如is_base_of_v<B, remove_const_t<remove_reference_t<TB>>>。
| 归档时间: |
|
| 查看次数: |
52 次 |
| 最近记录: |