Доступ к данным обратного вызова C++

Я пытаюсь создать оболочку вокруг функций класса. Цель моей оболочки — проверить ввод, вывод и обеспечить порядок операций с различными вызовами в моей программе. Я пытаюсь не вносить никаких изменений в вызываемый класс. Прикреплен пример того, чего я пытаюсь достичь, но не могу понять.

Main.cpp

#include "func_warpper.h"
#include "func.h"

int main()
{
    func_wrapper fw
    fun func;
    int origValue = 5;
    fw.caller([&](int origValue) { func.f(origValue); }, origValue);
    int output = func.getResult().number;
    std::cout << " value outputed by function 2 : " << output << std::endl;
    // output
    // note that above line does give me the result I am looking for
    // however, I want to be able to get this inside the function of caller
    return 0;
}

func.h .... Я хочу, чтобы это не изменялось

#ifndef FUN_H
#define FUN_H

class fun 
{
    public:
        struct result
        {
            int number;
        };
        fun();
        ~fun();
        void f(int value);
        struct result getResult(){return this->testResult;};
        private:
            struct result testResult;
};
#endif

func.cpp .... Я хочу, чтобы это не изменялось

#include "func.h"


fun::fun(){
    this->testResult.number = 0;
    return;
}
fun::~fun(){
    return;
}
void fun::f(int value){
    int updateValue = value * 5;
    this->testResult.number = updateValue;
}

func_wrapper.h .... Я могу изменить это, пока коровы не вернутся домой, пожалуйста, внесите рекомендуемые изменения :)

class func_wrapper
{
public:
    struct new_result
    {
        int new_number;
    };
    func_wrapper();
    ~func_wrapper();

    void caller(std::function<void(int)> clb, int val);
    struct new_result getNewResult() { return this->new_testResult; };
    private:
        struct new_result new_testResult;
};

#endif

func_wrapper.cpp .... то же, что и выше, я могу изменить это, пока коровы не вернутся домой, пожалуйста, внесите рекомендуемые изменения :)

#include "func_wrapper.h"


func_wrapper::func_wrapper()
{
    //ctor
    this->new_testResult.new_number = 0;
    return;
}

func_wrapper::~func_wrapper()
{
    //dtor
}

void func_wrapper::caller(std::function<void(int)> clb, int val)
{
    std::cout << " value entered into function: " << val << std::endl;
    // clb(val); seems to call the function but does not store locally anything
    clb(val);
    clb;
    // clb; seems to store all the information locally however I seem unable to 
    // to reach the infromation: clb -> [functor] -> func -> testResult -> number
    // would like ...
    int output = clb ???  // the result of what gets filled from number struct
    // if I attempt to #include func.h
    // func func;
    // func.getResult().number; locally the answer is zero with or without delay
}

За несколько дней поиска я не нашел ничего, что может помочь с этой проблемой, чтобы включить достаточно похожие вопросы по переполнению стека. Любая помощь будет принята с благодарностью, спасибо.

Комментарии не для расширенного обсуждения; этот разговор был перешел в чат.

Samuel Liew 21.03.2022 03:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
42
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Итак, насколько я понимаю, внутри func_wrapper::caller вы хотите иметь доступ к обернутому классу, который находится внутри вашего обратного вызова. К сожалению, то, как вы это делаете, невозможно. Нет (законного) способа проникнуть внутрь функции и получить доступ к ее аргументам.

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

template <typename Type, typename Function>
void caller(Type&& functor, Function function, int val)
{
   std::cout << " value entered into function: " << val << std::endl;
    
   std::invoke(function, functor, val);

   std::cout << "value inside wrapper: " << functor.getResult().number << "\rn";
}

а затем назовите это так.

fw.caller(func, &fun::f, origValue);

https://godbolt.org/z/151YfEeoo

Да, это тоже работает как решение. Спасибо, что уделили время и помогли лучше понять все это.

John Shepard 20.03.2022 20:44
Ответ принят как подходящий

@JohnFilleau упомянул о передаче объекта класса вместо функции внутри класса. Ниже приведено решение, основанное на примере кода, который он предоставил, и я изменил его для работы с примером. Я понимаю, что вопрос сбивает с толку, но хотел бы поблагодарить JohnFilleau и Taekahn за обсуждение.

В main.cpp

int main()
{
    func_wrapper fw;
    fun func;
    int origValue = 5;
    fw.caller2(func, origValue);
return 0:
}

func_wrapper:: вызывающий абонент2

    void func_wrapper::caller2(fun& fun, int val)
{
    std::cout << " value entered into function: " << val << std::endl;
    fun.f(val);
    int output = fun.getResult().number;
    std::cout << " did this work: " << output << std::endl;

}

В шапку пришлось добавить

#include "func.h"

с изменением заголовка следующим образом

void caller2(fun& fun, int val);

Другие вопросы по теме