簡體   English   中英

如何在編譯時訪問模板化類的模板類型?

[英]How to access a template type of a templated class at compile time?

我正在嘗試編寫基本的TaskRunner系統。 輔助對象完成一些工作並返回結果。 任務運行器運行一個工作程序對象並返回該工作程序的結果。 這是我現在所擁有的(通常會出現警告:簡化示例;可能無法編譯):

工人階級:

template<typename ResultType>
class Worker
{
public:
    virtual ~Worker() = 0;
    virtual ResultType DoWork() = 0;
};

跑步班:

template<typename ResultType, typename WorkerType>
class TaskRunner
{
public:
    template<typename... Args>
    TaskRunner( Args&&... args )
    {
        Worker = std::unique_ptr<WorkerType>(new WorkerType(std::forward<Args>(args)...));
    }
    ~TaskRunner() {}

    ResultType StartWork() 
    {
        return Worker->DoWork();
    }

private:
    std::unique_ptr<WorkerType> Worker;
};

我想專門讓每個工人返回一個具體類型:

class CustomWorker : public Worker<int>
{
public:
    CustomWorker(int InNumber) : Number(InNumber) {}
    ~CustomWorker() {}
    int DoWork() override { return Number; };
private:
    int Number;
};

我已經完成了所有這些工作,可以通過以下電話啟動系統:

TaskRunner<int, CustomWorker> CustomTask(1);

問題在於,CustomWorker與int的返回類型緊密相關。 這是適用於此任務的模板類型的唯一組合。 每個工作者只有一個,並且只有一個返回類型。 因此,我希望能夠致電:

TaskRunner<CustomWorker> CustomTask(1);

但這似乎需要了解TaskRunner :: StartWork定義中的CustomWorker模板化類型。

像這樣

template<typename WorkerType>
class TaskRunner
{
public:
    ...

    WorkerType::ResultType StartWork() 
    {
        ...
    }
    ...

是否有一些模板語法/ constexpr魔術可以幫助我實現這一目標?

如果您想將StartWork聲明為返回DoWork()返回的任何內容,那么您可以選擇在C ++ 14中讓實現將其找出來

auto StartWork() 
{
    return Worker->DoWork();
}

或者,在C ++ 11中用decltype指定它

auto StartWork() -> decltype(Worker->DoWork())
{
    return Worker->DoWork();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM