передача переменной класса в функцию API - PullRequest
0 голосов
/ 24 февраля 2020

Я хочу отслеживать глобальную переменную, которую я передаю в функцию API. Я обнаружил, что это можно сделать с помощью класса:

template <class T>
class MonitoredVariable
{
public:
    MonitoredVariable() {}
    MonitoredVariable(const T& value) : m_value(value) {}

    //T operator T() const { return m_value; }

    const MonitoredVariable& operator = (const T& value)
    {
        PlugIn::gResultOut << "value changed " << std::endl;
        m_value = value;
        return *this;
    }


private:
    T m_value;
};

Функция API принимает переменные как

bool APIFunction(double time, bool *is_done, double *fraction_done);

Следующее дает мне ошибку:

ImagePtr Im;
bool is_done;
MonitoredVariable<double*> fraction_done;
bool frameready = Im->APIFunction(2.1, is_done, fraction_done);

ERROR:
    error C2664: cannot convert argument 3 from 'MonitoredVariable<double *>' to 'double *'

что я должен изменить здесь? ТНХ!

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

В последующем, возможно, больше смысла в том, чего я хочу достичь. Я хочу ввести переменную класса в функцию API и отслеживать переменную в режиме реального времени. Это значение изменяется от нуля до 1 каждые 3 мс или около того. Тем не менее, я стараюсь избегать использования while l oop и отслеживать его в классе с помощью оператора overloaded =.

#include "stdafx.h"
#include <iostream>
#include <thread>
#include <future>

using namespace std;

template <class T>
class MonitoredVariable
{
public:
    MonitoredVariable() {}
    MonitoredVariable(const T& value) : m_value(value) {}


    void printValue() {
        std::cout << m_value;
    }

    const MonitoredVariable& operator = (const T& value)
    {
        m_value = value.m_value;
        if(m_value> 0.8) std::cout << m_value;  // *THIS NEVER GETS PRINTED!!!*

        return *this;
    }


    T& getValue() {

        return m_value;
    }

private:
    T m_value;
};

bool func(bool *is_done, double* fraction_done) {

    unsigned long c = 1;

    while (*is_done)
    {
        *fraction_done =  (double) 0.01*c;
        this_thread::sleep_for(chrono::milliseconds(10));
        c++;
        if (*fraction_done >= 1) *is_done = false;
    }

    return true;
}

int main()
{

    bool is_done = true; 
    MonitoredVariable<double> *MonitoredVariablePtr = new MonitoredVariable<double>();

    std::future<bool> fu = std::async(std::launch::async,func, &is_done, &MonitoredVariablePtr->getValue()); 


    // IF I UNCOMMENT THIS, IT PRINTS...
     /*
    while(is_done)
    {
    if(MonitoredVariablePtr->getValue() > 0.8)  MonitoredVariablePtr->printValue();
    }
    */

return 0;
}

Почему нет (if (m_value> 0.8) std :: cout << m_value) строка в классе никогда не печатается при обновлении значения? </p>

THX!

0 голосов
/ 25 февраля 2020

Я не совсем уверен, если это то, что вы хотите:

#include <iostream>

using namespace std;

template <class T>
class MonitoredVariable
{
public:
    MonitoredVariable() {}
    MonitoredVariable(const T& value) : m_value(value) {}

    //T operator T() const { return m_value; }

    const MonitoredVariable& operator = (const T& value)
    {
        //PlugIn::gResultOut << "value changed " << std::endl;
        m_value = value.m_value;
        return *this;
    }

    void printValue() {
        std::cout << m_value;
    }

    T& getValue() {
        return m_value;
    }

private:
    T m_value;
};

bool func(double firstDouble, bool *is_done, double* fraction_done) {
    // do stuff

    *fraction_done = firstDouble + (40.23 * 5);
    *is_done = true;
    return true;
}

int main()
{
    bool is_done = true;
    MonitoredVariable<double> fraction_done;

    func(2.10, &is_done, &fraction_done.getValue());

    fraction_done.printValue();

    return 0;
}

Так что в основном у нас есть класс с именем MonitoredVariable, который имеет переменную с именем m_value. Я не совсем уверен, почему вы хотели, чтобы это был указатель, потому что мы также можем взять адрес обычной двойной переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...