我有一堂課:
template<typename F1, typename F2, typename F3>
class A {
F1 f1;
F2 f2;
F3 f3;
A(F1 f1_, F2 f2_, F3 f3_) : f1{f1_}, f2{f2_}, f3{f3_} {};
apply_f1() {f1();};
apply_f2() {f2();};
apply_f3() {f3();};
}
并有以下類,我需要用某些 lambda 函式實體化類 A。我的 lambda 函式需要我捕獲,this因為我需要 lambda 中的某些類成員。lambda 所需的介面:[this](void)->void
class B {
A a // How to instantiate it correctly.
// .. other stuff.
}
由于我不知道如何將 A 實體class B化為成員,所以到目前為止,我所做的是class A在建構式中創建一個靜態實體,class B如下所示:
B::B(){
auto f1 = [this]() {....};
auto f2 = [this]() {....};
auto f3 = [this]() {....};
static A a = A(f1,f2,f3);
SomeEventRegisterClass(a);
}
本質上將注冊的SomeEventRegisterClass實體,class A現在讓我們假設它知道哪個 lambdas (apply_f1, apply_f2, apply_f3)在某些事件上呼叫。在上面的示例中,我必須宣告變數astatic 因為否則如果只是在本地宣告它將超出范圍在建構式完成后立即。因此,當特定事件觸發并SomeEventRegisterClass嘗試使用class A其 lambda 實體時,將超出范圍。
上面使用靜態的修復會帶來其他問題;當在 GTEST 框架中使用一個簡單的并且您在一個可執行檔案中運行多個測驗時,靜態將只定義一次。因此,我正在嘗試查看是否可以為每個類創建這樣的實體,以及 lambda 的范圍與class B
uj5u.com熱心網友回復:
你可以宣告a為A<std::function<void()>, std::function<void()>, std::function<void()>>. 這將讓它接受捕獲 lambda:
#include <functional>
class B {
public:
B() : a([this] {}, [this] {}, [this] {}) {}
private:
A<std::function<void()>, std::function<void()>, std::function<void()>> a;
};
請注意,也A必須制作建構式public。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/515120.html
標籤:C 模板拉姆达
上一篇:通過openlayers加載dwg格式的CAD圖并與互聯網地圖疊加
下一篇:函式指標的自動模板推導
