Как преобразовать из строки в двойное в двойное * - PullRequest
0 голосов
/ 20 октября 2018

Я изучаю C ++, так что это может быть основным вопросом, однако это проблема реальной жизни.Мне нужно преобразовать строку в двойную, а затем, в свою очередь, в двойную * самым элегантным / современным способом (> C ++ 98).

Структура обеспечивается платформой на основе C (здесь я упростил код, поскольку это только суть проблемы), и я не могу изменить структуру, поскольку она взаимодействует с торговым приложением Metatrader4 с закрытым исходным кодом (не на основе С).Программный интерфейс требует, чтобы указатель был передан в структуру.

Строки читаются из файла CSV, содержащего дамп, который я взял из приложения Metatrader4.Детали которого выходят за рамки этой проблемы.Тем не менее, входные данные остаются строками и, следовательно, являются типом источника.

Я ценю, что метод, используемый в платформе, может быть старым, но это часть жизни.Это не значит, что я не могу стремиться сделать что-то лучше в своем коде, поэтому я и попросил элегантные / современные решения.Если они не существуют, я буду вынужден использовать новый, как кто-то уже предложил.

В настоящее время у меня есть следующий не работающий код:

#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 голосов
/ 20 октября 2018

Как уже упоминалось в комментариях, кто-то должен владеть объектами, на которые указывают указатели.

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;
};
0 голосов
/ 20 октября 2018

Проблема в том, что вам нужны некоторые фактические значения для ваших указателей , на которые нужно указывать.Они не могут просто указывать на временные значения, возвращаемые вашими функциями преобразования чисел .

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;
}
...