我有一系列我想鏈接在一起的任務對象,這樣一個任務的輸出就是下一個任務的輸入。在模板對象向量中的每個元素上調用模板方法
template <typename Input, typename Output> class Task {
public:
std::function<Output(Input)> func;
Task(std::function<Output(Input)> func) : func(func){};
Output run(const Input& input) { return func(input); }
};
太棒了,現在我可以將一些任務鏈接在一起。
#include <iostream>
#include "Task.h"
int main() {
auto func1 = [](int i) {
return i + 1;
};
auto func2 = [](std::string i) {
return stoi(i);
};
Task<int, int> task1(func1);
Task<std::string, int> task2(func2);
std::cout << task1.run(task2.run("1"));
return 0;
}
但現在,我想將作業一個TaskList
容器,所以我不需要硬編碼任務的這些鏈。該API可能如下:
class TaskList {
public:
std::vector<ITask> tasks;
void append(ITask task) { tasks.push_back(task); }
void run() { // Run all tasks }
};
哪裏ITask
是各種Task<Input, Output>
類型的基類。我該如何寫這樣的ITask
和TaskList
類?在引入類型的地方有很多方法來進行混洗(例如,Task
構造函數,run
方法),但是我還沒有找到推廣到TaskList
的方法。
這種方法是完全錯誤的嗎?或者是我想要做不好的設計?
你有問題。如果使用通用容器,則每個階段的輸入/輸出類型在編譯時都是未知的。這意味着您需要將每個階段的結果存儲在「變體」或「任意」中,然後下一階段必須將變體強制轉換爲正確的類型(或將其轉換或扔出) –
@RichardHodges或者如果任務I/O類型在編譯時是已知的,'tuple'' – AndyG
啊,我希望避免走這條路,但是,輸入/輸出類型在編譯時是未知的。我也可以爲我的所有輸入/輸出類型設置一個基類,但這很糟糕,因爲我可能無法控制所有類型。 – danielsuo