c++ - 减少重载函数和构造函数的数量

标签 c++ templates polymorphism overloading

考虑以下类定义:

class Car : public Vehicle {
    private:
        TouchScreen a;
        RadioAntenna b;
        Blah c;
    public:
        Car(TouchScreen &a1) {
            a = a1; //copy ctor
        }
        Car(RadioAntenna &b1) {
            b = b1;
        }
        Car(Blah &c1) {
            c = c1;
        }
        void update(Touchscreen &a1) {
            a.update(a1);
        }
        void update(RadioAntenna &b1) {
            b.update(b1);
        }
        void update(Blah &c1) {
            c.update(c1);
        }
}

class Fleet {
    private:
        std::map<int, Car> _fleet; //vehicle number, Car
    public:
        template <typename T>
        void update(int vehicle_num, T &t) {
            auto it = _fleet.find(vehicle_num);
            if (it == _fleet.end()) {
                _fleet[vehicle_num] = Car(t);
            }
            else {
                it->second.update(t);
            }
        }
}

Fleet 包含汽车的集合。如果你想更新特定汽车的成员变量,

Fleet f;
f.update<TouchScreen>(4, a1);
f.update<Blah>(10, c1); 

以后Car里面可以定义更多的类实例。有没有办法减少重载的 Constructor 和 update() 函数的数量?也许使用模板?我觉得它看起来丑陋,设计明智,使用了这么多重载函数。

最佳答案

我的想法是使用 std::any 来完成它。假设 Car 类中的每种类型只有一个实例。

这是我的解决方案:

class Car : public Vehicle {
private:
    std::unordered_map<std::string, std::any> components;
public:
    Car(std::any &obj) {
        std::string typeName(obj.type().name());
        components.insert(make_pair(typeName, obj));
    }

    template<typename T> 
    void update(T& found, T &a1)
    {
        (std::any_cast<T>(found)).update(std::any_cast<T>(a1));
    }

    void update(std::any  &a1) {
        std::string typeName(a1.type().name());
        std::any found  =  components.find(typeName);
        if (found != components.end())
        {
            if (typeName ==  std::string(typeid(TouchScreen).name())
            {
                update<TouchScreen>(found.second, a1);
            }
            else if (typeName ==  std::string(typeid(RadioAntenna ).name())
            {
                update<RadioAntenna>(found.second, a1);
            }
            else if (typeName ==  std::string(typeid(Blah  ).name())
            {
                update<Blah>(found.second, a1);
            }

        }
    }

}

关于c++ - 减少重载函数和构造函数的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54739659/

相关文章:

c++ - put_time 是否具有转换说明符,该说明符输出月份中没有前导字符的个位数天数

c++ - 如何将 PNM 文件连接成数组?

c++ - 在 C++ 中以微秒的分辨率测量时间?

c++ - 错误 : there are no arguments to 'at' that depend on a template parameter, 因此 at 的声明必须可用

c# - 如何从 C# 中的类对象数组访问属性?

java - 在多态性问题上需要帮助

c++ - 漫反射 Material 奇怪的光线追踪行为

c++ - 什么时候需要在模板特化的第二个 <> 中指定类型?

c++ - 如何更改模板实例化顺序?

java - Java 中的多态值