Если Вы взаимодействуете через интерфейс с библиотекой C, то Вы не можете использовать функцию членства класса, не используя что-то как boost::bind
. Библиотеки Most C, которые берут функцию обратного вызова обычно также, позволяют Вам передавать дополнительный аргумент своего выбора (обычно типа void*
), который можно использовать для начальной загрузки класса, как так:
class C
{
public:
int Method1(void) { return 3; }
int Method2(void) { return x; }
int x;
};
// This structure will hold a thunk to
struct CCallback
{
C *obj; // Instance to callback on
int (C::*callback)(void); // Class callback method, taking no arguments and returning int
};
int CBootstrapper(CCallback *pThunk)
{
// Call the thunk
return ((pThunk->obj) ->* (pThunk->callback))( /* args go here */ );
}
void DoIt(C *obj, int (C::*callback)(void))
{
// foobar() is some C library function that takes a function which takes no arguments and returns int, and it also takes a void*, and we can't change it
struct CCallback thunk = {obj, callback};
foobar(&CBootstrapper, &thunk);
}
int main(void)
{
C c;
DoIt(&c, &C::Method1); // Essentially calls foobar() with a callback of C::Method1 on c
DoIt(&c, &C::Method2); // Ditto for C::Method2
}
Перезаписывать содержание одного файла в другой файл. используйте кошку, например,
echo "this is foo" > foobar.txt
cat foobar.txt
echo "this is bar" > bar.txt
cat bar.txt
Теперь для перезаписи foobar, мы можем использовать команду кошки как ниже
cat bar.txt >> foobar.txt
cat foobar.txt