如何将这段代码转换为静态多态?

时间:2017-03-09 02:38:11

标签: c++ templates

我正在尝试研究静态多态性,我实现了以下代码。感谢StackOverflow成员的评论,我开始明白我刚写的不是静态多态,而是基于模板的策略模式。

任何人都可以提供有关如何将这段代码转换为静态多态性的任何见解吗?

#include <iostream>

template<typename T>
class Interface {
    T ex;
public:
    double getData() {
        return ex.getData(0);
    }
};

class Extractor1 {
public:
    double getData(const int a) {
        return 1;
    }
};

class Extractor2 {
public:
    double getData(const int a) {
        return 2;
    }
};


int main() {

    // here is the problem: the following 2 variables belong to different types. Therefore, I cannot create an array of pointers which point to the base class
    Interface<Extractor1> e1;
    Interface<Extractor2> e2;

    std::cout<<"FE1 "<< e1.getData() <<" FE2 "<< e2.getData()<<std::endl;

    return 0;
}

1 个答案:

答案 0 :(得分:0)

您可以像这样更改代码以实现静态多态:

#include <iostream>

template <typename T>
class Interface {
public:
  double getData(int a) {
    return static_cast<T *>(this)->getData(a);
  }
};

class Extractor1 : public Interface<Extractor1> {
public:
  double getData(int a) {
    return 1;
  }
};

class Extractor2 : public Interface<Extractor2> {
public:
  double getData(int a) {
    return 2;
  }
};

int main() {
  Interface<Extractor1> e1;
  Interface<Extractor2> e2;

  std::cout << e1.getData(1) << " " << e2.getData(2) << std::endl;
}

使用静态多态的优点是可以避免像使用虚函数时那样支付vtable查找的运行时成本。但是,正如我所看到的那样,你会遇到一个缺点,那就是基于你的数组&#39;注释,是您不能将这些不同的Extractor类放入数组或任何其他容器中,因为它们都继承了不同的基类型。解决这个问题的唯一方法是,除了使用类似于元组或填充了boost :: any类型的容器之外,还要为Extractor类创建一个公共基类。