如何规避虚拟模板成员函数?

时间:2014-06-25 19:51:58

标签: c++

我有一个模板类Field<T>,它继承自非模板抽象基类AbstractField,以便能够在Field<T> *中存储所有不同类型的std::vector<AbstractField *>类型。我的设置如下:

#include <vector>

class AbstractField
{
    public:
        virtual ~AbstractField() {};
        // Something similar to: template<class T> T getValue() const; ?
};

template<class T>
class Field : public AbstractField
{
    private:
        T d_;

    public:    
        Field(T d) : d_(d) {}
        T getValue() const { return d_; }
};

int main()
{
    AbstractField *f = new Field<double>(0.1);
    // How to call: f->getValue(); ?

    return 0;
}

我想知道调用f->getValue()最自然的方法是什么,因为我无法在AbstractField类中使用虚拟模板成员函数。我希望尽可能不使用boost。欢迎任何提示!

修改

已将std::vector<Field<T> >更正为std::vector<AbstractField *>。对不起,感到困惑。

1 个答案:

答案 0 :(得分:2)

也许这个:

template <typename> struct Field;

struct AbstractField
{
    virtual ~AbstractField() {}

    template <typename T> T getValue()
    {
        return dynamic_cast<Field<T>&>(*this)->get();
    }
};

template <typename T> struct Field : AbstractField
{
    T & get();
    // ...
};