在运行时使用模板参数实例化类(C ++)?

3

是否可以在运行时以以下方式使用模板参数实例化一个类?:

#include <iostream>
#include <vector>

using namespace std;

template<typename T>
struct Foo {
  vector<T> d;
};

template<typename T>
struct Solver {
  Foo<T> data;

  virtual void calc() = 0;
};

struct SolverA : Solver<int>
{
  void calc() 
  {
    cout << "PRINT A\n";
  }
};

struct SolverB : Solver<double>
{
  void calc() 
  {
    cout << "PRINT B\n";
  }
};

int main()
{
  ... solver;

  if (...) {
    solver = new SolverA;
  } else {
    solver = new SolverB;
  }

  solver->calc();
}

因此,类SolverASolverB没有模板参数,但无法在编译时确定哪个将被使用。我尝试使用boost::any来解决这个问题,但我不确定如何将变量solver强制转换以调用函数calc()。还有其他的想法吗?

2个回答

3
添加类的接口: 您可以为您的类添加一个接口:
#include <iostream>
#include <vector>

using namespace std;

template<typename T>
struct Foo {
  vector<T> d;
};

struct SolverIface
{
  virtual void calc() = 0;
};

template<typename T>
struct Solver : SolverIface {
  Foo<T> data;
};

struct SolverA : Solver<int>
{
  void calc()
  {
    cout << "PRINT A\n";
  }
};

struct SolverB : Solver<double>
{
  void calc()
  {
    cout << "PRINT B\n";
  }
};

int main()
{
  SolverIface *solver;

  if (0) {
    solver = new SolverA;
  } else {
    solver = new SolverB;
  }

  solver->calc();
}

模板和虚拟调度不搭配。


@LuchianGrigore 哦,好吧。你把Foo移到了求解器中(这甚至更好):) - BЈовић
太好了!对于这个简单的例子来说,它起作用了。我会回到我的工作代码中尝试同样的事情。 - Thomas W.

2

没有,也不应该有,因为SolverASolverB完全不相关的类型。它们有不同的基类。

你可以这样做:

struct SolverInterface
{
  virtual void calc() = 0;
};

template<typename T>
struct Solver : SolverInterface {
  Foo<T> data;
};


int main()
{
   SolverInterface* solver;
   if (...) {
      solver = new SolverA;
   } else {
      solver = new SolverB;
   }
   solver->calc();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接