减少重载函数和构造函数的数量

时间:2019-02-18 02:21:56

标签: c++ templates polymorphism overloading

请考虑以下类定义:

<div>
  <p (click)=toggleClickedState() [ngClass]="isSelected? 'selected' : '' "> Search Result : {{result}}</p>
  <p *ngIf="isSelected" class="cross" (click)="isSelected = false;">close</p>
<div>

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

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

2 个答案:

答案 0 :(得分:1)

替代代码可能是:

void Car::update(Touchscreen* a1=nullptr, RadioAntenna* b1=nullptr, Blah* c1=nullptr ) {
        if(a1) a.update(*a1);
        if(b1) b.update(*b1);
        if(c1) c.update(*c1);                        
}

答案 1 :(得分:1)

我的想法是使用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);
            }

        }
    }

}