0

我有一些使用模板的代码,所以我可以在浮点数、实数、双精度之间切换,以实现计算精度或节省内存。现在我想让用户在每次执行时选择精度,但我不确定我应该怎么做。

假设在我的 main.cpp 我有

// main.cpp
Object<double> obj;
obj.doSomething();

有没有办法“设置”使用的类型?像下面这样的东西?

//main.cpp

std::cout << "Choose Precision ": << std::endl;
std::cin  >> PRECISION; // eg float or double

? fix precision and use generic code below with it ?

Object<PRECISION> obj; 

obj.doSomething();

更新

现在很明显我不能在执行时。谢谢。

我是否仍然可以在主要使用通用模板代码,以便我只有 1 行可以编辑以不同精度编译代码?

Kevin Cadieux 回答的更新:typedef double MyPrecision;

4

3 回答 3

4

不,因为模板在编​​译时工作,您试图在运行时更改类型。如果你想这样做,你应该使用继承和多态。

于 2013-10-06T08:43:22.397 回答
4

您不能在运行时设置模板的类型,但您可以选择要使用的模板特化。例如:

template <typename T>
void doStuff<T>()
{
  Object<T> obj;
  // do something with obj
}

int main()
{
  // same PRECISION getting code
  switch (PRECISION) {
  case (x) :
    doStuff<double>();
    break;
  case(y) :
    doStuff<float>();
    break;
  ....
}
于 2013-10-06T08:44:13.860 回答
1

简单地说:没有。模板实例化发生在编译时。您的 PRECISION 变量只会在运行时知道,因此您不能使用它来实例化模板。

正如约翰所说,在这种情况下(以及任何其他仅基于运行时条件才知道行为的情况),使用多态性是最合适的。

你可能有一个类似于这样的类层次结构:

class SomePrecisionBase
{
    virtual double compute() = 0;  //Or whatever
};

class MySuperPreciseClass
{
    virtual double compute(); //Super precise computation
};

class MyNotSoPreciseClass
{
    virtual double compute(); //Not so precise computation
};

然后,为了使用来自的用户输入构建正确的类std::cin,您可能需要编写一个工厂函数,如下所示:

SomePrecisionBase* factory(int precision)
{
    //Construct a concrete class here and return it as a SomePrecisionBase pointer
    //Also consider using an std::shared_ptr instead of a raw pointer
}

编辑

但是,如果您只想在双浮点计算和单浮点计算之间进行选择,这绝对是奇怪的。在这种情况下,我更喜欢 juanchopanza 的方法。

或者,您可以在代码中的某处有一个 typedef,类似于:

typedef double MyPrecision;

如果你想决定编译时间,那么你可以用 MyPrecision 实例化你的模板,如果你改变主意,只有一个地方可以修改。

于 2013-10-06T08:52:30.243 回答