C++中如何从交换机语句返回不同类型的变量

C++中如何从交换机语句返回不同类型的变量,c++,inheritance,casting,scope,switch-statement,C++,Inheritance,Casting,Scope,Switch Statement,我正在尝试实现工厂以基于传递的类id返回派生类的实例 class Day : public IDay { /* ... */ }; class Day01 : public Day { void calculate_part1() override; /* ... */ }; . . . class Day25 : public Day { void calculat

我正在尝试实现工厂以基于传递的类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是具有唯一计算函数的类


我尝试在切换之前在类作用域中创建Day{}变量,然后将其向下转换到Day01。。。带有动态内置开关。在这种情况下,我在派生类中丢失了唯一的计算函数。我可能可以通过模板来实现这一点,但如果没有模板,我将非常感谢任何帮助。

对于每个派生类型,您需要不同的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);
            :

是的,我可能会将其重构为案例1:return createDayHelperid@是的,看起来这是最好的decisions@16406谢谢你的解决方案,但这正是我想要避免的。我们的想法是找到一个解决方案,不重复25倍长的返回语句。设计不完整,参数也会改变,所以在25个位置改变它会有点开销。
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>();
    }
}