如何将字符串从双精度转换为双精度*

时间:2018-10-19 21:02:18

标签: c++ double

我正在学习C ++,所以这可能是一个基本问题,但是,这是一个现实生活中的问题。我需要以最优雅/现代的方式(> C ++ 98)将字符串从字符串转换为双精度,然后再转换为双精度*。

该结构由基于C的框架提供(我在这里简化了代码,因为这仅是问题的症结),并且由于它与封闭源Metatrader4交易应用程序(非基于C的接口)对接,因此我无法更改框架)。编程接口要求将指针传递给结构。

正在从包含我从Metatrader4应用程序获取的转储的csv文件中读取字符串。其细节超出了此问题。但是,输入仍然是字符串,因此是原始类型。

我很欣赏框架中使用的方法可能很老套,但这是生活的一部分。这并不意味着我不能渴望在代码中做得更好,因此我之所以要求优雅/现代的解决方案。如果它们不存在,那么我将被迫使用new,因为有人已经建议过。

我目前没有以下无效代码:

#include <string>

struct bidAsk
{
    double *bid;
    double *ask;
};

int main()
{
    bidAsk ba;
    ba.bid = std::stod("1.100");
    ba.ask = &std::stod("1.102");
}

但是,上述两种转换方法均会因转换错误而失败。

第一行会导致错误,提示:

E0513   a value of type "double" cannot be assigned to an entity of type "double *"

第二行导致以下错误:

E0158   expression must be an lvalue or a function designator

我也尝试过static_cast,const_cast,make_unique和(double *)强制转换。

谢谢。

2 个答案:

答案 0 :(得分:3)

问题是您需要一些实际值来指向指针指向。他们不能只是指向从您的数字转换函数返回的临时值。

struct bidAsk
{
    double* bid;
    double* ask;
};

int main()
{
    bidAsk ba;

    // these have to exist somewhere that lives as long as the
    // bidAsk object that points to them.
    double bid_value = std::stod("1.100");
    double ask_value = std::stod("1.102");

    ba.bid = &bid_value; // just pointing to the real values above
    ba.ask = &ask_value;
}

答案 1 :(得分:1)

正如评论中其他人所述,某人必须拥有对象,指针指向。

extern C {

struct bidAsk
{
    double *bid;
    double *ask;
};

}

struct BidAskWrapper
{
  BidAskWrapper(const std::string& sbid, const std::string& sask) 
                       :bid{std::stod(sbid)}, ask{std::stor(sask)} 
  {}         
  //Note: bidAsk valid only till the lifetype of the wrapper
  bidAsk make_c_struct() {
    return {&bid, &ask};
  }
  double bid, ask;
};