你想達到什么目的
通常,我想轉換
RetType ClassA::MemberFunc(Args...)為mem_fn(&ClassA::MemberFunc)但它就像一個函式,以避免為每個成員函式撰寫 lambda 或函式
你得到了什么(包括錯誤資訊)
沒有匹配的函式呼叫'regisAdd(std::_Mem_fn<int (ABC::*)(int, int)>)'
你還嘗試了什么?
我嘗試了其他方法,沒有線索,仍然認為它可行與否。
你認為是什么原因造成的?
因為我懶得為每個成員函式寫每一個 lambda
為什么你需要為它提出一個新問題?為什么您的問題與此處的其他類似問題不同?
我搜索了,沒有找到任何類似的答案。
你為什么寫這么長的 F&Q
因為 stackoverflow 抱怨看起來你的帖子主要是代碼;請添加更多詳細資訊
這是我的代碼..
#include <functional>
#include <iostream>
using namespace std;
struct ABC {
int value;
int add(int a, int b) {
return a b * value;
}
int other(int a) {
return a * value;
}
};
int doAdd(void* data, int a, int b) {
ABC* p = (ABC*)data;
return p->add(a, b);
}
typedef int (*TYPE_ADD)(void* data, int a, int b);
TYPE_ADD gAdd = nullptr;
void regisAdd(TYPE_ADD a) {
gAdd = a;
}
void callAdd() {
if (!gAdd) return;
ABC abc;
abc.value = 10;
cout << gAdd(&abc, 1, 2) << endl;
}
typedef int (*TYPE_OTHER)(void* data, int a);
TYPE_OTHER gOther = nullptr;
void regisOther(TYPE_OTHER a) {
gOther = a;
}
void callOther() {
if (!gOther) return;
ABC abc;
abc.value = 10;
cout << gOther(&abc, 12) << endl;
}
int main() {
regisAdd(doAdd); // this is GOOD
callAdd(); // call
regisAdd([](void* data, int a, int b) { // < this is also GOOD
return static_cast<ABC*>(data)->add(a, b); // < GOOD
}); // < GOOD
callAdd(); // call
// how to write a general function work like mem_fn
// to avoid write doAdd and lambda for every function signatures
// regisAdd(mem_fn(&ABC::add));
// regisOther(mem_fn(&ABC::other));
// callAdd();
return 0;
}
uj5u.com熱心網友回復:
據我了解,您想要的是:
template <auto mem> // C 17, else <typename T, T mem>
struct mem_to_func;
template <typename C, typename Ret, typename ... Args,
Ret (C::*m)(Args...)>
struct mem_to_func<m>
{
static Ret func_ptr(C* c, Args... args)
{
return (c->*m)(std::forward<Args>(args)...);
}
static Ret func_ref(C& c, Args... args)
{
return (c.*m)(std::forward<Args>(args)...);
}
static Ret func_voidp(void* p, Args... args)
{
auto* c = static_cast<C*>(p);
return (c->*m)(std::forward<Args>(args)...);
}
};
template <typename C, typename Ret, typename ... Args,
Ret (C::*m)(Args...) const>
struct mem_to_func<m>
{
static Ret func(const C* c, Args... args)
{
return (c->*m)(std::forward<Args>(args)...);
}
static Ret func_ref(const C& c, Args... args)
{
return (c.*m)(std::forward<Args>(args)...);
}
static Ret func_voidp(const void* p, Args... args)
{
const auto* c = static_cast<const C*>(p);
return (c->*m)(std::forward<Args>(args)...);
}
};
// Others specializations for combination with
// - volatile,
// - reference to this,
// - and C-ellipsis...
進而
regisAdd(mem_to_func<&ABC::add>::func_voidp);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/333140.html
上一篇:復制建構式在cpp模板中不起作用
