gpt4 book ai didi

c++ - 自动从成员函数签名中推导 lambda 参数

转载 作者:行者123 更新时间:2023-12-02 17:18:38 25 4
gpt4 key购买 nike

通常,我使用 lambda 函数来设置对第三方库的成员函数的回调。例如:

setCallback([this](auto&& ...x) { handleCallback(std::forward<decltype(x)>(x)...); });

现在我有一个带有重载函数的库来设置回调,使得这一行不明确:

#include <functional>
#include <iostream>

class Library
{
public:
typedef std::function<void (int)> IntFunction;
typedef std::function<void (int, int)> IntIntFunction;

void setCallback(IntFunction f) { f_int_ = f; }
void setCallback(IntIntFunction f) { f_int_int_ = f; }

void callCallback(int a, int b) {
if (f_int_) f_int_(a);
if (f_int_int_) f_int_int_(a, b);
}

private:
IntFunction f_int_;
IntIntFunction f_int_int_;
};

class MyClass
{
public:
MyClass() {
//lib.setCallback([this](auto&& ...x) { handleCallback(std::forward<decltype(x)>(x)...); });
lib.setCallback([this](int a, int b) { handleCallback(a, b); });
}

void handleCallback(int a, int b) {
std::cout << "handleCallback: " << a << ", " << b << std::endl;
}

Library lib;
};

int main()
{
MyClass myclass;
myclass.lib.callCallback(2, 3);
return 0;
}

有没有办法自动从 handleCallback 函数中推导出正确的参数,以避免 lambda 中出现重复的函数参数?

最佳答案

您可以为此创建函数:

class MyClass
{
template <typename Ret, typename ...Args>
void setCallback(Ret (MyClass::*member)(Args...) /*const*/) {
lib.setCallback([=](Args...args)
{
(this->*member)(std::forward<decltype(args)>(args)...);
});
}

public:
MyClass() { setCallback(&MyClass::handleCallback); }

void handleCallback(int a, int b) {
std::cout << "handleCallback: " << a << ", " << b << std::endl;
}

Library lib;
};

Demo

关于c++ - 自动从成员函数签名中推导 lambda 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58749625/

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