Я использую библиотеку ac для интеграции, где подынтегральное выражение объявлено как fun (..., void * fdata,...)
который использует * указатель fdata для передачи внешних переменных, однако, прежде чем выполнять численное интегрирование, мне нужно
интерполировать необработанные данные с помощью других библиотек c++, возвращая некоторые интерполирующие объекты класса,
в основном я хочу передать эти объекты в подынтегральное выражение, которое определено пользователем...
Вы можете использовать структуру и передать указатель на нее, но мне кажется, что у вас нет фиксированного количества объектов для передачи, и, следовательно, объект, агрегирующий другие динамически, будет лучше соответствовать вашим потребностям, поэтому вы можете использовать std::vector
и передать его адрес как параметр func
fdata
.
Пример:
#include <vector>
#include <iostream>
using namespace std;
class C //Mock class for your objs
{
public:
C(int x)
{
this->x = x;
}
void show()
{
cout << x << endl;
}
private:
int x;
};
void func(void *fdata) //Your function which will recieve a pointer to your collection (vector)
{
vector <C *> * v = (vector<C *> *)fdata; //Pointer cast
C * po1 = v->at(0);
C * po2 = v->at(1);
po1->show();
po2->show();
}
int main()
{
vector<C *> topass;
topass.push_back(new C(1)); //Create objects and add them to your collection (std::vector)
topass.push_back(new C(2));
func((void *)(&topass)); //Call to func
for(vector<C *>::iterator it = topass.begin(); it != topass.end(); it++)
delete(*it);
}
func(const std::vector<C*>& fdata)
или `` func (const std :: vector <void *> & fdata) `при необходимости - и избегать дополнительного приведения?
fdata
обязательно void *
В противном случае, предложенное вами объявление лучше.
void*
s, а не шаблонизируете параметры функции или не используете указатели на базовый класс. Почему вы поставили метку "С" на вопрос?