簡體   English   中英

如何從C++中的switch語句返回不同類型的變量

[英]How to return different types of variable from switch statement in c++

我正在嘗試實現工廠以根據傳遞的類 ID 返回派生類的實例。

    class Day : public IDay {
        /* ... */
    };

    class Day01 : public Day {
        void calculate_part1() override;
        /* ... */
    };
    .
    .
    .
    class Day25 : public Day {
        void calculate_part1() override;
        /* ... */
    };



    std::unique_ptr<Day> Factory::createDay(uint8_t id) {

        //how to extract "day" variable from switch and pass it to return statement?

        switch (id) {
            case 1: { Day01 day{}; break; } 
            case 2: { Day02 day{}; break; }
            ....
            case 25:{ Day25 day{}; break; }
            default:{ Day day{}; }
        }

        return std::make_unique<decltype(day)>(id, info[id].name, info[id].url,
                                     info[id].input_data_file);
    }

Day01...Day25 是具有獨特計算功能的類。

我嘗試在switch之前在類范圍內創建Day day{}變量,然后將其向下轉換為Day01... with dynamic_cast inside switch 在那種情況下,我在派生類中丟失了唯一的計算函數。 我可能可以在模板的幫助下實現這一點,但如果沒有它,我將不勝感激。

對於每個派生類型,您都需要不同的make_unique實例化。 所以你最終需要這樣的代碼:

std::unique_ptr<Day> Factory::createDay(uint8_t id) {
    switch (id) {
        case 1: return std::make_unique<Day01>(id, info[id].name, info[id].url,
                                 info[id].input_data_file);
        case 2: return std::make_unique<Day02>(id, info[id].name, info[id].url,
                                 info[id].input_data_file);
        case 3: return std::make_unique<Day03>(id, info[id].name, info[id].url,
                                 info[id].input_data_file);
            :

如果您關心的是減少重復輸入,您可以將make_unique調用包裝在另一個模板中:

template<class DAY, uint8_t ID> std::unique_ptr<Day> Factory::createDay() {
    return std::make_unique<DAY>(ID, info[ID].name, info[ID].url,
                                   info[ID].input_data_file); }

std::unique_ptr<Day> Factory::createDay(uint8_t id) {
    switch (id) {
        case 1: return createDay<Day01, 1>();
        case 2: return createDay<Day02, 2>();
              :
        case 25: return createDay<Day25, 25>();
    }
}

暫無
暫無

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

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