【发布时间】:2019-09-02 05:10:05
【问题描述】:
我本来打算把一个变量的引用传递给一个成员函数指针,这个指针是另一个varadic模板函数的参数,用来调用一个类的任何一种成员函数,但是从打印结果来看,它并没有被传递参考,但只是按价值。
#include <functional>
#include <iostream>
#include <memory>
template <class WorkerType> class Delegate {
public:
template <typename... Args>
using WrkFunc = void (WorkerType::*)(Args... args);
explicit Delegate(WorkerType &wrk) : m_worker(&wrk) {}
template <typename... Args>
void workerDo(WrkFunc<Args...> func, Args &&... args) {
auto fn = std::bind(func, m_worker.get(), std::forward<Args>(args)...);
fn();
}
private:
std::shared_ptr<WorkerType> m_worker;
};
class SomeWorker {
public:
SomeWorker() = default;
void doSomething(int &a) {
a = 1000;
std::cout << "2# address: " << &a << ", value: " << a << std::endl;
}
};
int main() {
SomeWorker wrk;
Delegate<SomeWorker> del(wrk);
int a = 0;
std::cout << "1# address: " << &a << ", value: " << a << std::endl;
del.workerDo(&SomeWorker::doSomething, a);
std::cout << "3# address: " << &a << ", value: " << a << std::endl;
return 0;
}
我期望的结果是这样的:
1#地址:0x7fffc1dc621c,值:0
2#地址:0x7fffc1dc621c,值:1000
3#地址:0x7fffc1dc621c,值:1000
但实际结果是:
1#地址:0x7fffc1dc621c,值:0
2#地址:0x7fffc1dc61d0,值:1000
3#地址:0x7fffc1dc621c,值:0
【问题讨论】:
-
请注意
bind复制其参数。 -
对不起,我不太明白,因为我使用了 std::forward
标签: c++ function c++11 variadic-templates