【问题标题】:template virtual function模板虚函数
【发布时间】:2012-07-03 04:43:59
【问题描述】:

这里有一些代码:

class IWorker {
public:
    virtual void Do(int x) const = 0;
};

class TSomeWorker : public IWorker {
    void Do(int x) const {
        // ...
    }
};

现在,假设我们需要重构它,使函数 Do 应该成为模板(int 更改为某个 T)。我知道 C++ 不允许创建模板虚函数。有没有其他选择?

【问题讨论】:

标签: c++ templates virtual


【解决方案1】:

这取决于您的具体需求。但是根据您发布的内容,我建议:

template<typename T>
class IWorker {
public:
    virtual void Do(T x) const = 0;
};

template<typename T>
class TSomeWorker : public IWorker<T> {
    void Do(T x) const {
        // ...
    }
};

【讨论】:

  • 这里的问题是,当我在其他一些类中使用 IWorker 类时,我也必须将它们设为模板。但他们不是。类的性质表明只有函数 Do 是模板化的 :)
  • @jpalecek 链接到的答案中描述了一个通用的解决方案。如果您想为您的问题提供更具体的解决方案,则必须提供更多背景信息。
【解决方案2】:

因此,您希望混合使用静态多态性(模板)和运行时多态性(虚拟函数),但它们是正交的。在这种情况下,您需要强制转换:

class IWorker {
public:
    virtual void Do(void* x) const = 0;
};

template< typename T >
class TSomeWorker : public IWorker {
    void Do(void* x) const {
        T* realX = reinterpret_cast< T* >( x );
        // ...
    }
};

【讨论】:

    猜你喜欢
    • 2010-11-19
    • 2017-06-10
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 2019-11-19
    相关资源
    最近更新 更多