小编Jul*_*anH的帖子

将带有移动捕获的lambda传递给函数

我最近在努力寻找一个很难找到的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.这工作正常,但我认为可能有更性感的方式来做到这一点.

我现在有两个问题:

  1. 为什么这个错误会增加?
  2. 我的想法:我fstreamfor循环中生成了许多对象和lambda ,并且每个fstream都有一个lambda写入它.因此,fstream只能通过lambdas 来访问对象.我想为一些回调逻辑做这个.有没有像我尝试过的lambda那样更漂亮的方式?

c++ lambda c++14

10
推荐指数
1
解决办法
963
查看次数

静态获取成员变量的偏移量

我正在寻找一种方法来获取成员变量的偏移量,以静态地将此偏移量传递给成员变量.基本上我想实现这个:

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)

有没有办法做到这一点?

c++ templates

7
推荐指数
1
解决办法
197
查看次数

调用带有std :: function作为lambda参数的函数

我从这里获得的问题的依据是: 无法从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)

c++ c++11

6
推荐指数
1
解决办法
95
查看次数

标签 统计

c++ ×3

c++11 ×1

c++14 ×1

lambda ×1

templates ×1