2012-02-22 59 views
3

我有一个函数,它的原型是这样的:如何通过浮点值的功能以双为参考值

void example (double &var); 

不过,我的问题是,我可能需要对以及调用函数与一些浮点值。 例如

float temp=10.1; 

example(temp) 

如果我这样做,我的代码不会编译,可能是因为将浮点值传递给双引用变量。

我想避免编写double和float的重载函数。

有人可以请建议一个清洁/更好的方式来实现这一点?

功能基本上是截断输入的截断函数&是原始被修改。

谢谢。

回答

2

你可以模板它。

template<typename T> 
void example (T &var) 
4

模板函数怎么样?

template <typename T> 
void example (T &var); 

编译器将取代双方floatdouble用法(记住C++模板与类型安全宏)

3

不推荐通过引用传递小类型。你最好有double example(double var);之类的东西。这也将解决你的问题。

前:

void example(double& d); 

double d = ...; 
example(d); // unclear if d was modified 

后:

double example(double d); 

double d = ...; 
d = example(d); 

float f = ...; 
f = static_cast<float>(example(f)); // cast required to tell the compiler to allow 
             // the precision loss 
0

的解决方案取决于究竟example在做什么。

  • 它是否更改通过引用传递的值?如果是的话,你不能通过float它。强制转换传递将会编译,但会在运行时崩溃(因为您需要传递4个字节,其中需要8个字节)。
  • 如果它不更改值,则可以将const属性添加到它,并传递任何基本数据类型。这将是:void example (const double &var);。如果可以转换(因为它现在被视为(double)),编译器不会抱怨。
  • 使它成为函数模板可能工作也可能不工作,它完全取决于函数在做什么。
+0

是的,通过引用传递的值被改变。 该函数是截断给定输入的截断函数。 是否有任何问题将其作为模板? 正如您所建议的那样? 我可能会面对什么? 谢谢。 – user1147663 2012-02-23 05:31:02

+0

截断如何?截断小数?分成两部分?转换为字符串和修剪?要获得很好的答案,你应该提出很好的问题! :) – Ajay 2012-02-23 06:52:58