我最近在努力寻找一个很难找到的bug.我试图将lambda传递给一个获取std::function对象的函数.lambda正在捕获一个不可复制的对象.
我想通了,显然一些副本必须在所有通行证之间发生.我来到这个结果是因为我总是以error: use of deleted function错误结束.
以下是产生此错误的代码:
void call_func(std::function<void()> func)
{
func();
}
int main()
{
std::fstream fs{"test.txt", std::fstream::out};
auto lam = [fs = std::move(fs)] { const_cast<std::fstream&>(fs).close(); };
call_func(lam);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我通过在std::fstream对象中加载对象来解决这个问题std::shared_ptr.这工作正常,但我认为可能有更性感的方式来做到这一点.
我现在有两个问题:
fstream在for循环中生成了许多对象和lambda ,并且每个fstream都有一个lambda写入它.因此,fstream只能通过lambdas 来访问对象.我想为一些回调逻辑做这个.有没有像我尝试过的lambda那样更漂亮的方式?我正在寻找一种方法来获取成员变量的偏移量,以静态地将此偏移量传递给成员变量.基本上我想实现这个:
template <std::intptr_t OFFSET>
struct A
{
std::intptr_t self()
{
return reinterpret_cast<std::intptr_t>(this) - OFFSET;
}
};
struct B
{
int some_variables[256];
A<???> a;
};
int main()
{
B b;
assert(reinterpret_cast<std::intptr_t>(&b) == b.a.self()); // shall pass
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
我从这里获得的问题的依据是: 无法从lambda函数推断出模板参数std :: function 。此线程中的问题是:为什么此代码无法将lambda传递给函数:
#include <iostream>
#include <functional>
template <typename T>
void call(std::function<void(T)> f, T v)
{
f(v);
}
int main(int argc, char const *argv[])
{
auto foo = [](int i) {
std::cout << i << std::endl;
};
call(foo, 1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该线程的答案是,因为lambda不是a std::function。但是为什么这段代码会编译:
#include <iostream>
#include <functional>
template <typename T>
void call(std::function<void(T)> f, T v)
{
f(v);
}
int main(int argc, char const *argv[])
{
auto foo = [](int i) {
std::cout << i << std::endl; …Run Code Online (Sandbox Code Playgroud)