Calculation我有一個具有功能的第三方類setCallback:
typedef void (*callback_function)(void);
class Calculation
{
public:
void setCallback(callback_function pFunc);
};
和我想用作回呼的函式
void callback(int id);
例如,我想創建四個(編譯時已知的數量)物件Calculation并為每個物件設定回呼。我可以做類似的事情
void callback0() { callback(0); }
void callback1() { callback(1); }
void callback2() { callback(2); }
void callback3() { callback(3); }
int main() {
std::vector<Calculation> vec;
for (int i = 0; i < 4; i ) {
Calculation c = Calculation();
vec.push_back(c);
}
vec[0].setCallback(callback0);
vec[1].setCallback(callback1);
vec[2].setCallback(callback2);
vec[3].setCallback(callback3);
return 0;
}
問題:如何在不重復和重復代碼的情況下實作這一目標?
我在想lamdas,比如
for (int i = 0; i < 4; i ) {
Calculation c = Calculation();
c.setCallback([i]() -> void {callback(i);});
vec.push_back(c);
}
但是如果 lambda 沒有捕獲 ,則只能將其轉換為函式指標。
uj5u.com熱心網友回復:
模板功能可能會有所幫助:
template <int N>
void callbackN() { callback(N); }
接著
vec[0].setCallback(callback<0>);
vec[1].setCallback(callback<1>);
vec[2].setCallback(callback<2>);
vec[3].setCallback(callback<3>);
uj5u.com熱心網友回復:
由于 Calculation 實體的數量在編譯時是已知的,因此您設定了這樣的東西來自動化事情,但不確定是否值得付出努力:
template <size_t Size, typename Idx = std::make_index_sequence<Size>>
class CalcInterface {
std::array<callback_function, Size> m_callbacks { makeCallbacks(Idx{}) };
std::array<Calculation, Size> m_calcs;
protected:
template <size_t N>
static inline callback_function makeCallback() {
return []{ return callback(N); };
}
template <size_t... Seq>
static inline auto makeCallbacks(std::index_sequence<Seq...>) {
std::array<callback_function, Size> arr;
((arr[Seq] = makeCallback<Seq>()), ...);
return arr;
}
static void callback(int id) {
std::cout << "Callback #" << id << " was called\n";
}
public:
CalcInterface() {
for (size_t i=0; i<Size; i) {
m_calcs[i].setCallback(m_callbacks[i]);
}
}
void runAll() const {
for (auto& calc: m_calcs) calc.run();
}
};
此處示例:https ://godbolt.org/z/sWTzn59ce
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/421214.html
標籤:
上一篇:從檔案C 中的選定行讀取數字
