gpt4 book ai didi

c++ - 泛型成员函数指针作为模板参数

转载 作者:IT老高 更新时间:2023-10-28 21:46:05 28 4
gpt4 key购买 nike

考虑这段代码:

#include <iostream>
using namespace std;

class hello{
public:
void f(){
cout<<"f"<<endl;
}
virtual void ff(){
cout<<"ff"<<endl;
}
};

#define call_mem_fn(object, ptr) ((object).*(ptr))

template<R (C::*ptr_to_mem)(Args...)> void proxycall(C& obj){
cout<<"hello"<<endl;
call_mem_fn(obj, ptr_to_mem)();
}

int main(){
hello obj;
proxycall<&hello::f>(obj);
}

当然这不会在第 16 行编译,因为编译器不知道 RCArgs 是什么.但是还有另一个问题:如果试图在 ptr_to_mem 之前定义那些模板参数,他会遇到这种糟糕的情况:

template<typename R, typename C, typename... Args, R (C::*ptr_to_mem)(Args...)> 
// ^variadic template, but not as last parameter!
void proxycall(C& obj){
cout<<"hello"<<endl;
call_mem_fn(obj, ptr_to_mem)();
}

int main(){
hello obj;
proxycall<void, hello, &hello::f>(obj);
}

令人惊讶的是,g++ 并没有提示 Args 不是模板列表中的最后一个参数,但无论如何它不能将 proxycall 绑定(bind)到正确的模板函数,只是注释这是一个可能的候选人。

有什么解决办法吗?我最后的手段是将成员函数指针作为参数传递,但如果我可以将它作为模板参数传递,它将更适合我的其余代码。

编辑:正如一些人指出的那样,这个例子似乎毫无意义,因为 proxycall 不会传递任何参数。在我正在处理的实际代码中并非如此:参数是通过 Lua 堆栈中的一些模板技巧获取的。但是那部分代码和问题无关,比较冗长,这里就不贴了。

最佳答案

你可以试试这样的:

template <typename T, typename R, typename ...Args>
R proxycall(T & obj, R (T::*mf)(Args...), Args &&... args)
{
return (obj.*mf)(std::forward<Args>(args)...);
}

用法:proxycall(obj, &hello::f);

或者,要使 PTMF 成为模板参数,请尝试特化:

template <typename T, T> struct proxy;

template <typename T, typename R, typename ...Args, R (T::*mf)(Args...)>
struct proxy<R (T::*)(Args...), mf>
{
static R call(T & obj, Args &&... args)
{
return (obj.*mf)(std::forward<Args>(args)...);
}
};

用法:

hello obj;

proxy<void(hello::*)(), &hello::f>::call(obj);

// or

typedef proxy<void(hello::*)(), &hello::f> hello_proxy;
hello_proxy::call(obj);

关于c++ - 泛型成员函数指针作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9779105/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com