gpt4 book ai didi

c++ - 将一个函数名称传递给模板以在模板主体内使用它的多个重载

转载 作者:行者123 更新时间:2023-11-30 03:15:08 25 4
gpt4 key购买 nike

我在上课,里面有一些电话。每个调用都带有两个回调参数:分别用于成功和错误情况。在这些回调中,我必须调用名称为“answerCallName”的两种情况的重载函数,但根据成功情况向其传递不同的参数。

因此,随着此类调用数量的增加,为每个调用定义两个内部回调变得很烦人。

所以我正在寻找比“复制粘贴”更好的解决方案。
我正在寻找模板。但是找不到任何方法来使用一个函数名称(如参数)将其用于模板内的不同重载。

我尝试制作一些模板,但显然失败了,因为模板要求执行函数指针,如果函数重载,我需要明确显示此类型。

//========================================================
//Here is exaple of class (library) with a lot of calls
class SomeLargeClass
{
protected:
void callToDoSmth1(std::function<void(int)>, std::function<void(std::string)>);
void callToDoSmth2(std::function<void(char)>, std::function<void(std::string)>);
void callToDoSmth3(std::function<void(const A & a)>, std::function<void(std::string)>);
...
};

//========================================================
//Here is calls I should call when one of callbacks are called. Also this part is placed in the library
class ResponsesClass
{
protected:
void answerCallToDoSmth1(int);
void answerCallToDoSmth1(std::string);

void answerCallToDoSmth2(char);
void answerCallToDoSmth2(std::string);

void answerCallToDoSmth3(const A & a);
void answerCallToDoSmth3(std::string);

...
}

//========================================================
//Here is my class
class MyProxy: public SomeLargeClass, public ResponsesClass
{
...
void action1();
}

//========================================================
//
void MyProxy::action1()
{
auto success = [](int value)
{
ResponsesClass::answerCallToDoSmth1(value);
}

auto error = [](std::string value)
{
ResponsesClass::answerCallToDoSmth1(value);
}

SomeLargeClass::callToDoSmth1(success, error);
}

所以我正在寻找类似的东西:


template<class ResponseFn, class ReturnType, class Object>
std::pair<
std::function<void(ReturnType)>,
std::function<void(std::string)>
>
MyProxy::createCallbacks(ResponseFn responseFn, Object object)
//--------------------------------------------------------------------
{
auto onSuccess = [this, responseFn] (ReturnType value)
{
(object->*responseFn)(value);
};

auto onError = [object, responseFn](std::string value)
{
(object->*responseFn)(value);
};
return std::pair<decltype(onSuccess), decltype(onError)>(onSuccess, onError);
}

通过一个函数调用为每个调用创建回调。

void MyProxy::actionX()
{
auto callbacks = createCallbacks<int>(&MyProxy::answerCallToDoSmthX); //not working due to diffrent function addresses
SomeLargeClass::callToDoSmthX(callbacks.first, callbacks.second);
}

我只是想知道是否可以在没有 makroses 和生成器的情况下解决它。是否计划在未来的标准中解决?

最佳答案

因为 C++14 lambda 可以有 auto参数:

void MyProxy::action1()
{
auto success_and_error = [=](auto... value)
{
ResponsesClass::answerCallToDoSmth1(value...);
};

SomeLargeClass::callToDoSmth1(success_and_error, success_and_error);
}

这有效地使 lambda 的 operator()采用任意数量参数的可变参数模板函数。这样 lambda 可以隐式转换为 std::function<void(int)> , std::function<void(std::string)> , std::function<void(std::string, int, float, int, A, B, C)> ,以及任何你喜欢的东西,只要有相应的重载 SomeLargeClass::callToDoSmth1()采用相同的参数。

关于c++ - 将一个函数名称传递给模板以在模板主体内使用它的多个重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57271753/

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