更改成员向量的类型

时间:2015-10-12 12:05:23

标签: c++ templates vector

我想弄清楚如何改变矢量的类型。类foo表示许多算法使用的数据结构。但是,新要求是将最后的处理算法的结果存储为浮点数据。下面的代码显示了问题的最低版本

#include <iostream>
#include <string>
#include <vector>

using namespace std;

class foo{
    protected:
    vector<int> a; 
    public:
    virtual void print(){
        cout<<"foo type of " <<sizeof(a[0])<<endl;
    };
};

class bar: public foo
{
    vector<double> a;
};

int main()
{
    foo f;
    f.print();

    bar b;

    b.print();

    return 0;
}

&#34;程序的输出&#34;是:

foo type of 4
foo type of 4

我的期望是:

foo type of 4
foo type of 8

那么如何在没有大量代码重复的情况下获得这样的结果呢? 我期待着您的回音。

2 个答案:

答案 0 :(得分:2)

你可以尝试使用这样的模板:

#include <iostream>
#include <vector>

template <typename Type>
class foo{
protected:
    std::vector<Type> a;
public:
    void print(){
    std::cout << "Foo type of " << sizeof(a[0]) << std::endl;
    }
};

int main()
{
    foo<int> f;
    f.print();

    foo<double> b;
    b.print();

    return 0;
}

示例输出:

Foo type of 4
Foo type of 8

答案 1 :(得分:2)

当涉及编译时已知的类型时,静态多态(使用模板)通常比运行时多态(使用虚函数)更强大。

您的期望是基于错误的假设,即在派生类中隐式重新定义虚函数。由于您没有覆盖虚拟功能,因此您不会从虚拟功能中获益,您也可以省略virtual关键字。因为它是在基类中定义的,所以它总是引用基类中的a成员。

MPI_回答显示了使用模板的可能方法。 编辑:对于基于运行时多态性的解决方案,您可以将静态与动态多态相结合,从而实现一种称为类型擦除的技术:

struct Base
{
    virtual void print() const = 0;
}

template <typename T>
struct Derived : Base
{
    virtual void print() const
    {
        ...
    }

    std::vector<T> a;
};