Я пытаюсь создать оболочку вокруг функций класса. Цель моей оболочки — проверить ввод, вывод и обеспечить порядок операций с различными вызовами в моей программе. Я пытаюсь не вносить никаких изменений в вызываемый класс. Прикреплен пример того, чего я пытаюсь достичь, но не могу понять.
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
}
За несколько дней поиска я не нашел ничего, что может помочь с этой проблемой, чтобы включить достаточно похожие вопросы по переполнению стека. Любая помощь будет принята с благодарностью, спасибо.
Итак, насколько я понимаю, внутри 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
Да, это тоже работает как решение. Спасибо, что уделили время и помогли лучше понять все это.
@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);
Комментарии не для расширенного обсуждения; этот разговор был перешел в чат.