正在变量模板中复制的参考参数
Reference parameter being copied in variadic template
我有一个Event类,它将weak_ptr(观察器)的一组元组存储到一个函数中,该函数在事件"激发"时执行。
函数类型为:void(int&)。也就是说,我想激发传递对某个值的引用的事件,让观察者更改该值,并验证该值在被观察对象中是否已更改回。顺便说一句,事件实现是可变的,这可能会使问题复杂化(至少是代码)。
目前这是失败的。在这条线上的某个地方,引用正在被转换为非引用或复制,但我看不出在哪里。
全额回购低于。注意assert(value!=10)失败,即使我在事件处理程序中将值设置为1。
#include <memory>
#include <tuple>
#include <vector>
#include <cassert>
#include <functional>
template<class FunctionPrototype>
class Event
{
public:
template<typename... Args>
void operator()(Args... args)
{
for (auto const & listener : Listeners)
{
if (auto locked = std::get<0>(listener).lock())
std::get<1>(listener)(args...);
}
}
template<typename P, typename Q, typename R, typename... Args>
void Attach(P(Q::*f)(Args...), std::shared_ptr<R> const & p)
{
auto w = std::weak_ptr<R>(p);
auto l = [w, f](Args... args) {
if (auto locked = w.lock())
return (*locked.get().*f)(args...);
else
return P();
};
Listeners.push_back(std::make_tuple(std::weak_ptr<void>(w), l));
}
typedef std::tuple<std::weak_ptr<void>, std::function<FunctionPrototype>> event_tuple;
std::vector<event_tuple> Listeners;
};
class Observed : public std::enable_shared_from_this < Observed >
{
public:
int value;
void Fire()
{
value = 10;
TheEvent(value);
assert(value != 10);
}
Event<void(int &)> TheEvent;
};
class Observer : public std::enable_shared_from_this<Observer>
{
public:
void Attach(std::shared_ptr<Observed> const & observed)
{
observed->TheEvent.Attach(&Observer::OnEvent, shared_from_this());
}
void OnEvent(int & value)
{
assert(value == 10);
value = 1;
}
};
int main(void)
{
auto observed = std::make_shared<Observed>();
auto observer1 = std::make_shared<Observer>();
observer1->Attach(observed);
observed->Fire();
return 0;
}
Event::operator()
按值获取参数。重写如下:
template<typename... Args>
void operator()(Args&&... args)
{
for (auto const & listener : Listeners)
{
if (auto locked = std::get<0>(listener).lock())
std::get<1>(listener)(std::forward<Args>(args)...);
}
}
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 使用strcpy将char数组的元素复制到另一个数组
- 是否可以初始化不可复制类型的成员变量(或基类)
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 通用参考 l 值不复制对象
- C 标准:通过复制返回以初始化无RVO的参考:是否有任何副本
- 如果值来自成员变量,则复制初始化和参考初始化之间的C 差异
- 如何使对象通过RVALUE参考通过而没有复制
- 复制C DLL以构建任何C#项目的输出,以扩展为参考
- 为什么合成的复制分配运算符被定义为如果类有参考成员,则将其定义为删除
- 参考的复制构造可以使用私有成员变量
- 如果lvalue,请参考,如果rvalue进行复制,即使rvalue持久
- Qt信号和插槽:是复制的参考参数
- C 复制分配运算符,用于参考对象变量
- 直接初始化和复制参考初始化
- c 参考class对象的返回 - 为什么未调用复制构造函数
- C 显式通用参考构造器不会隐藏复制构造函数
- 在Qt信号中发射QVector参考会导致复制
- 正在变量模板中复制的参考参数