【发布时间】:2012-03-29 12:44:21
【问题描述】:
我正在尝试使用 std::mem_fun_ref(是的,已弃用
版本。原因如下)通过代理调用成员函数。
template<typename T>
struct proxy {
T& operator*() { return *t; }
T* operator->() { return t; }
// no address of etc
T* t;
};
struct A {void foo() {}};
int main()
{
A a;
proxy<A> pa = {&a};
std::mem_fun_ref_t<void, A>
fn = std::mem_fun_ref(&A::foo);
fn(pa); // borks
return 0;
}
这适用于 C++11 std::mem_fn 但不适用于 boost::mem_fn,但
我不能使用这两个,因为我需要指定的类型
binder 在另一个地方,生成的 binder 的类型是
未指定 boost::mem_fn。如果我可以,这将不是问题
使用decltype 但我不能因为代码需要兼容
C++03.
解决此问题的最简单方法是什么?一个习俗
mem_fun_through_proxy?
编辑:另一个警告是 proxy 类不能更改。
【问题讨论】:
-
如果您将
operator T&() { return *t }添加到您的代理会怎样? -
@KerrekSB 啊,我忘了。也无法更改代理。其实就是一个迭代器。
-
@GeorgFritzsche 我无法控制呼叫站点,需要以通用方式调用它。
-
你能控制什么?显然函子类型和创建?
-
@GeorgFritzsche 没错。我希望用最少的样板来完成此任务,现在有另一个函子包装器
deref执行取消引用并将结果传递给mem_fun_ref_t。不用说,这在 C++03 中是一件很脆弱的事情。