gpt4 book ai didi

c++ - lambda 运算符重载?

转载 作者:太空狗 更新时间:2023-10-29 23:20:38 24 4
gpt4 key购买 nike

我之前问过类似的问题overloading operator >> for lambdas
但我没有解释我真正想要的是什么。

我正在围绕 sqlite3 C api 编写一个简单的包装器。
this is my project on github => sqlite modern cpp

我想重载 lambda 的 >> 运算符。
我想让下面的代码工作:

database db("dbfile.db");
db << "select age,name,weight from user where age > ? ;"
<< 18
>> [&](int age, string name, double weight) {
cout << age << ' ' << name << ' ' << weight << endl;
};

我想要这个主意!这就是为什么我在上一个问题中抽象了这个问题。我有一个 database_bind 类,它由 '<<' 运算符返回,我希望能够在 database_bind 类上重载 >> 运算符对于具有不同参数数量的 lambda。

目前我支持这种语法:

db << "select age,name,weight from user where age > ? ;"
<< 18
>> function<void(int,string,double)>([&](int age, string name, double weight) {
cout << age << ' ' << name << ' ' << weight << endl;
});

最佳答案

您需要的是回顾 Actor 。一种通过只传递一个 lambda(没有别的,没有模板参数,没有返回类型规范)来组成正确的函数对象类型的方法。

一种不依赖其他库的方法如下

#include <iostream>
#include<functional>
#include<vector>


using namespace std;


template<typename T>
struct memfun_type
{
using type = void;
};

template<typename Ret, typename Class, typename... Args>
struct memfun_type<Ret(Class::*)(Args...) const>
{
using type = std::function<Ret(Args...)>;
};

template<typename F>
typename memfun_type<decltype(&F::operator())>::type
FFL(F const &func)
{ // Function from lambda !
return func;
}

然后你可以知道你的 lambas 的返回类型并编写以下内容

int main() 
{
database_bind dbb;

dbb >> FFL([](int i, string s) { cout << i << ' ' << s << endl; });
dbb >> FFL([](int i) { cout << i << endl; });
dbb >> FFL([](string s,double d) { cout << s << ' ' << d << endl; });
}

关于c++ - lambda 运算符重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23594969/

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