小编Nin*_*ina的帖子

将有状态lambda传递给C风格函数而不使用context-argument

我正在尝试将C库集成到我的C++项目中.C库具有将函数指针作为参数的函数,但这些函数指针被写为typedef.

typedef void(*FileHandler_t)(File* handle);
Run Code Online (Sandbox Code Playgroud)

然后一个函数来注册回调,如下所示:

void RegisterCallback(FileHandler_t handler);
Run Code Online (Sandbox Code Playgroud)

我可以创建一个lambda表达式并将其传递给RegisterCallback作为参数处理程序

auto handler = [](File* handle){ //handle cb };
Run Code Online (Sandbox Code Playgroud)

这很好用.

RegisterCallback(handler);
Run Code Online (Sandbox Code Playgroud)

但是当我尝试传递局部变量以在处理程序中使用时,我收到编译器错误.

auto handler = [&container](File* handle){ //handle cb };
Run Code Online (Sandbox Code Playgroud)

现在RegisterCallback不再编译.我想这样做,因为我不想使用全局变量.反正在这些场景中正式使用的错误是什么?

从我所看到的,除了修改库本身之外别无他法.

c++ lambda function-pointers

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

从 Chrome 扩展程序中挂钩 Websockets

我正在尝试创建一个 Chrome 扩展内容脚本,它可以挂钩特定页面的 WebSocket。目前,当访问页面时,内容脚本会向页面注入另一个脚本,如下所示:

    var s = document.createElement('script');
    s.src = chrome.extension.getURL('Script.js');
    s.onload = function () {
        this.remove();
    };
    (document.head || document.documentElement).appendChild(s);
Run Code Online (Sandbox Code Playgroud)

然后我的 Script.js 包含一个用于 websockets 的 addEventListener 。

Window.WebSocket.addEventListener("message",function(event){
console.log("Websocket read");
})
Run Code Online (Sandbox Code Playgroud)

但是当我运行扩展时,我收到错误无法读取未定义的属性 addEventListener。所以我不完全确定这是否是正确的方法。我已经验证该脚本确实已注入页面,但我如何在页面的原始 onmessage WebSocket 之上覆盖或创建自己的侦听器。是否可以?

javascript hook addeventlistener websocket google-chrome-extension

5
推荐指数
1
解决办法
2919
查看次数

Firebase-无法通过Google登录进行身份验证

我正在玩Firebase,并试图通过Google登录进行身份验证。我创建了一个Firebase项目,并在登录方法中启用了Google提供程序。

然后在我的index.html中,这主要是由firebase init生成的。我在其中添加了按钮。

<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- update the version number as needed -->
    <script defer src="/__/firebase/6.0.2/firebase-app.js"></script>
    <!-- include only the Firebase features as you need -->
    <script defer src="/__/firebase/6.0.2/firebase-auth.js"></script>
    <script defer src="/__/firebase/6.0.2/firebase-database.js"></script>
    <script defer src="/__/firebase/6.0.2/firebase-messaging.js"></script>
    <script defer src="/__/firebase/6.0.2/firebase-storage.js"></script>
    <!-- initialize the SDK after all desired features are loaded -->
    <script defer src="/__/firebase/init.js"></script>
    <script src="signin.js"></script>

    </style>
  </head>
  <body>
      <button id="signin">Sign in</button>
  </body>
</html>

Run Code Online (Sandbox Code Playgroud)

然后在我的signin.js中处理登录

document.addEventListener("DOMContentLoaded", function(event) { 
    var firebaseConfig = {
        apiKey: "AIzaSyC8bHVEtWDcTLJ0b8UOOZ5ClCV1tobqm5w",
        authDomain: "second-d10d4.firebaseapp.com", …
Run Code Online (Sandbox Code Playgroud)

google-authentication firebase

4
推荐指数
2
解决办法
3006
查看次数

如果继承不是公开的而不是出错,为什么 enable_shared_from_this 会崩溃

我在一个项目中使用了 shared_ptr。有一次,我不得不将原始指针存储为 void,然后在传递 void* 的回调中将其转换回其 shared_ptr 形式。但由于某种原因,代码不断崩溃。我不明白为什么,因为我没有收到任何编译器错误或警告。但我注意到,当我继承自时,std::enable_shared_from_this我并没有将其分配为公共继承。这就是导致崩溃的原因。

我写了一个示例代码,我只是想知道它为什么会发生。

#include <memory>
#include <iostream>

class TestShared : public std::enable_shared_from_this<TestShared>{
private:
    int32_t id;
public:
    TestShared(int32_t id){
        this->id = id;
    }
    std::shared_ptr<TestShared> getshared(){
        return shared_from_this();
    }
    int32_t getid(){
        return id;
    }
};

int main(){
    std::shared_ptr<TestShared> ts(new TestShared(0xFF));
    void* tsp = ts.get();
    std::shared_ptr<TestShared> tsn = ((TestShared*)tsp)->getshared();
    std::cout << std::hex << tsn->getid();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以该代码将执行并运行良好,我得到了预期的结果。

但是当我从继承中删除 public 时:

#include <memory>
#include <iostream>

class TestShared : std::enable_shared_from_this<TestShared>{
private:
    int32_t id;
public:
    TestShared(int32_t id){
        this->id …
Run Code Online (Sandbox Code Playgroud)

c++ shared-ptr private-inheritance enable-shared-from-this

2
推荐指数
1
解决办法
260
查看次数

隐藏结构成员

我知道以前可能会问过这个问题,但是我想采取自己的方法,并征求意见或采取更好的方法。我有三个文件a.h a.cmain.c关于struct的函数原型,将在a.h实现中a.c并从main.c结构中调用实现,这很简单,它看起来像这样

struct ctx{
    int x;
};
Run Code Online (Sandbox Code Playgroud)

我希望a.c能够操纵该结构的内容,但要防止main对其中的内容有任何了解。所以我想将struct定义放在里面,a.c而不是a.h放在struct ctx;原型中a.h 。这可以工作,但是ctx不能再分配到堆栈中,main.c因为编译器不知道要分配的大小。因此,这引出了我的第一个问题:是否有一种方法可以在不知道结构定义的情况下在堆栈中分配本地结构。

因此,我假设如果在堆栈上不可能,那么我可以将其传递到堆上,而不是通过创建一个简单的返回指针的init函数。那确实可行,但是会使流程复杂化吗?

a.h

#ifndef a_h
#define a_h

#include <stdio.h>
#include <stdlib.h>
struct ctx;
int incctx(struct ctx* c);
struct ctx* initctx(void);
void destroyctx(struct ctx* c);
#endif /* a_h */
Run Code Online (Sandbox Code Playgroud)

a.c

#include "a.h"
struct ctx{
    int x;
};
int incctx(struct ctx* c){
    return ++c->x;
}
struct ctx* initctx(){
    struct ctx* c = …
Run Code Online (Sandbox Code Playgroud)

c struct private

2
推荐指数
1
解决办法
83
查看次数