【问题标题】:How to pass float value to function taking double as reference value如何将浮点值传递给以双精度为参考值的函数
【发布时间】:2012-02-22 13:10:13
【问题描述】:

我有一个原型如下所示的函数:

void example (double &var);

但是,我的问题是我可能还需要使用一些浮点值调用函数。 例如

float temp=10.1;

example(temp)

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

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

有人可以建议一种更清洁/更好的方法来实现这一点吗?

Function 基本上是一个截断函数,它截断给定的输入,是的,原件已被修改。

谢谢。

【问题讨论】:

    标签: c++ pass-by-reference


    【解决方案1】:

    模板函数怎么样?

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

    编译器将同时替换 floatdouble 用法(请记住 C++ 模板是具有类型安全性的宏)

    【讨论】:

      【解决方案2】:

      不推荐通过引用传递小类型。你最好有类似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
      

      【讨论】:

        【解决方案3】:

        你可以做模板。

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

        【讨论】:

          【解决方案4】:

          解决方案取决于 example 到底在做什么。

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

          【讨论】:

          • 是的,通过引用传递的值已更改。该函数是截断给定输入的截断函数。将其作为模板有什么问题吗?按照你的建议?我可能面临什么?谢谢。
          • 截断成什么?截断小数?分成两部分?转换为字符串和修剪?为了得到好的答案,你应该提出好的问题! :)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-19
          • 2010-09-27
          • 1970-01-01
          • 1970-01-01
          • 2023-02-01
          相关资源
          最近更新 更多