我正在嘗試定義一個名稱空間/結構,其中包含存盤特定實作的函式指標(假設一個包含多個函式的結構)。現在一切正常,結構如下:
class foo{
int a;
int b;
public:
explicit foo(int _a, int _b) : a(_a), b(_b) {};
std::function<int(int)> bar(int num) = [=](int num) -> int{
// here I need to know a and b
//do something with num and return
}
}
這個類包含幾個函式,每個函式都必須知道 a 和 b。問題是我必須創建類的實體并設定引數 a 和 b,我寧愿省略。在另一個類中,我只通過使用它的功能來使用這個類。即
class foo2{
//some other parameters
int a, b;
std::function<...> fun1, fun2,...;
public:
foo2(int a, int b, ....){this->a = a; this->b = b;};
setFuncs(){
foo instance(a, b);
this->fun1 = [instance](int num){ return instance.bar(num);}
this->fun2 = ...
}
}
但我想每次都省略創建一個新的類 inctance(從某種意義上說,我在同一個類中重復上述行為,但在代碼中的另一個位置)。我試圖將這個類模板化為
template<int a, int b>
class foo{
...
}
所以我可以將功能分配為:
this->fun1 = foo<a,b>::bar;
但是我需要在編譯時知道 a 和 b,這是不可能的。這些引數在類 foo2 中設定一次。我意識到整體代碼可能并不干凈,正如您所見,我是物理學家,而不是 IT 人。一種方法是將類 foo 的實體存盤在類 foo2 中并為整個類初始化一次,并讓函式 fun1、fun2、... 通過參考這些指標來訪問,但我正在尋找是否有另一個方式(可能是類之類的模板,我不需要在編譯時知道這些值)。此外,我無法在此處粘貼整個代碼,因為它在多個檔案中包含數千行,并且很難描述代碼的作用。如果這可能是一個愚蠢或微不足道的問題,我感謝任何幫助并道歉(我不嚴格從事 IT 作業,我是一名物理學家;))
uj5u.com熱心網友回復:
您可以在已知和foo的值的建構式中創建 lambda 。ab
然后您還可以捕獲this以使用成員變數(以防它們在 lambda 創建和呼叫之間發生變化)。
class foo
{
int a;
int b;
public:
// No need for explicit since this isn't a "conversion" constructor
foo(int a, int b) : a(a), b(b)
{
bar = [this](int x)
{
// Use the argument together with this->a and this->b...
return some_value;
};
}
std::function<int(int)> bar;
};
uj5u.com熱心網友回復:
由于您希望某些輸入資料比單個函式呼叫保持更長的時間,除非它是完全編譯時的資料,否則運行時狀態是不可避免的。問題是您希望如何封裝這些資料 - 不同的方法會產生非常不同的(主觀)感覺它們有多方便。
根據您的使用示例:
this->fun1 = foo<a,b>::bar;
如果你想避免狀態(或者更確切地說封裝它),你可以創建一個工廠來為你創建函式:
std::function<int(int)> make_func(int a, int b)
{
return [=](int x){ return actual_function(a, b, x); };
}
this->fun1 = make_func(a, b); // now std::function will hold lambda's captured state
這個主題通常被稱為部分應用程式,我猜 boost 或其他庫已經有很多支持這種操作的代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/405353.html
標籤:
