2014-06-25 26 views
0

我有一个模板类Field<T>,它继承自非模板抽象基类AbstractField,以便能够在std::vector<AbstractField *>中存储所有不同种类的Field<T> *类型。我的设置如下:如何规避虚拟模板成员函数?

#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类使用虚拟模板成员函数的最自然的方式。尽可能地,我宁愿不使用提升。欢迎任何提示!

编辑:

更正std::vector<Field<T> >std::vector<AbstractField *>。对困惑感到抱歉。

+1

转换指针F到现场 *? – Matt

+0

你的意图是**每个**'AbstractField'应该实现一些'getValue()'? –

+0

@Matt我已经注意到我的问题不够清楚,我不能简单地将其转换为'Field *',因为我实际上将'f'传递给了另一个需要'AbstractField *'的函数,我不能确定'f'的基础类型,因此不能投射。 – Marcel

回答

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(); 
    // ... 
}; 
+0

@Deduplicator:当然,为什么不呢:-) –

+0

经过一些修改,我得到了您的代码运行。但是,我仍然需要调用'f-> getValue ()'来赋予编译器推断模板参数的能力,因为返回类型不是函数签名的一部分。不幸的是,当将'f'传递给另一个函数时,我无法确定'Field '的模板参数。据我所知,没有可能获得有关模板参数的运行时信息到'Field '。如果我错了,请纠正我。 – Marcel