【问题标题】:How to circumvent virtual template member functions?如何规避虚拟模板成员函数?
【发布时间】:2014-06-25 19:51:57
【问题描述】:

我有一个模板类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-&gt;getValue() 的最自然方式是什么,因为我不能在AbstractField 类中使用虚拟模板成员函数。尽可能地,我宁愿不使用 boost。欢迎任何提示!

编辑:

std::vector&lt;Field&lt;T&gt; &gt; 更正为std::vector&lt;AbstractField *&gt;。很抱歉造成混乱。

【问题讨论】:

  • 将指针 f 转换为 Field*?
  • 您是否打算每个 AbstractField 都应该实现一些getValue()
  • @Matt 我已经注意到我的问题不够清楚,因为我不能简单地转换为Field&lt;double&gt; *,因为我实际上将f 传递给另一个需要AbstractField * 的函数,其中我无法确定 f 的基础类型,因此无法转换。
  • @DrewDormann 不,我无意让 AbstractField 类实际实现 getValue()AbstractField 旨在成为各种Field&lt;T&gt; 的抽象基类,这样我就可以用Field&lt;int&gt;s、Field&lt;double&gt;s 等创建一个向量std::vector&lt;AbstractField *&gt;
  • 其实我是想写Field&lt;int&gt; *s、Field&lt;double&gt; *s等等。

标签: c++


【解决方案1】:

也许是这样的:

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

【讨论】:

  • @Deduplicator:当然,为什么不:-)
  • 经过一些修改,我让你的代码运行起来了。但是,我仍然必须调用 f-&gt;getValue&lt;double&gt;() 以使编译器能够推断出模板参数,因为返回类型不是函数签名的一部分。不幸的是,当将f 传递给另一个函数时,我无法确定Field&lt;T&gt; 的模板参数。据我所知,不可能获得有关Field&lt;T&gt; 的模板参数的运行时信息。如果我错了,请纠正我。
猜你喜欢
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多