如何避免使用模板类型的派生类进行多态的动态转换

时间:2017-03-31 19:20:28

标签: c++ templates inheritance polymorphism

我有这种架构(简短版本):

class BaseBatch {
    virtual ~BaseBatch(){};
};

template<class T>
class Batch : public BaseBatch
{

    void draw(T* data) {
       do something..
    }
};

class BatchManager
{
private:
   static std::vector<BaseBatch*> batches;
public:

    template <class T>
    static void placeData(T* data){

        //Loop through the entire container
        bool found = false;
        for (auto&& b: batches())
            if (b->get_type() == typeid(T)) {

                dynamic_cast<Batch<T>*>(b)->draw(data);
                found = true;
            }

        //If no bach found, create a new One
        if (not found) {
            batches.push_back(new Batch<T>);
        }
    }
};

问题是placeData函数每1个循环被调用多次(多次),我认为动态转换对于性能来说是一个真正的痛苦但是无法弄清楚如何在不使用它的情况下解决这个问题。这真的有问题,或者我不应该为此烦恼并继续使用它?如果我应该避免它,你会建议什么?感谢

1 个答案:

答案 0 :(得分:1)

而不是使用std::vector<Batch*>使用std::unordered_map<std::type_index, std::unique_ptr<BaseBatch>>。要访问批处理,请使用batches.find(std::type_index(typeid(T))),然后static_cast将其设置为Batch<T>*static_cast没有运行时开销。要创建新批次,请使用std::type_index(typeid(T))作为密钥。

dynamic_cast的表现可能不是问题。事实上,使用此解决方案调用typeid可能与dynamic_cast一样糟糕。真正的潜在收益是unordered_map vs的查找速度,它遍历了谁知道大vector的每个元素并尝试dynamic_cast

相关问题