Хотелось бы сделать подобное на С++. Внизу приведен текст proba.cpp, методы инициализации и деинициализации без параметров. Как бы сделать так чтобы можно было предавать методы инициализации и деинициализации с одним параметром, который передается тоже через шаблон?
/// proba.cpp
#include <iostream>
template<typename C>
class WithActiveObject
{
public:
typedef bool (C::*InitCallback0)();
typedef void (C::*ShutdownCallback0)();
WithActiveObject(C& object, InitCallback0 init, ShutdownCallback0 shutdown)
: _status(false),
_object(&object),
_init0(init),
_shutdown0(shutdown)
{
_status = (_object->*_init0)();
}
~WithActiveObject()
{
if(_status)
{
(_object->*_shutdown0)();
}
}
bool status() const
{
return _status;
}
private:
bool _status;
C *_object;
InitCallback0 _init0;
ShutdownCallback0 _shutdown0;
private:
WithActiveObject();
WithActiveObject(const WithActiveObject&);
WithActiveObject& operator=(const WithActiveObject&);
};
class MyDevice
{
public:
MyDevice()
{
std::cout << "MyDevice created." << std::endl;
}
~MyDevice()
{
std::cout << "MyDevice destroyed." << std::endl;
}
bool init()
{
std::cout << "MyDevice initialized" << std::endl;
return true;
}
void shutdown()
{
std::cout << "MyDevice uninitialized" << std::endl;
}
bool doSomething()
{
return false;
}
};
void test_device(MyDevice& device)
{
WithActiveObject<MyDevice> obj(device, &MyDevice::init, &MyDevice::shutdown);
std::cout << "Testing device..." << std::endl;
if(!device.doSomething())
{
std::cerr << "Failed to test device." << std::endl;
return;
}
}
int main()
{
MyDevice device;
test_device(device);
return 0;
}
output: if doSomething() returns false:
MyDevice created.
MyDevice initialized
Testing device...
Failed to test device.
MyDevice uninitialized
MyDevice destroyed.
output: if doSomething() returns true:
MyDevice created.
MyDevice initialized
Testing device...
MyDevice uninitialized
MyDevice destroyed.
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от den73
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от kira89
Ответ на:
комментарий
от Vinick

Ответ на:
комментарий
от www_linux_org_ru
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от Burbaka
Ответ на:
комментарий
от den73
Ответ на:
комментарий
от den73
Ответ на:
комментарий
от den73
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Поле типа unique_ptr и деструктор (2019)
- Форум Укозатель на функцию член (2006)
- Форум Насколько bool thread-safe (2019)
- Форум Валится на throw (2005)
- Форум чем можно заменить min_element/max_element с условием выборки? (2020)
- Форум libdl и обратные ссылки (2017)
- Форум Самодельный пасер на С++ : не удаляет комментарии (2015)
- Форум [C++] Статические константы класса в выражениях (2011)
- Форум Упреждающее объявление класса (2007)
- Форум Почему так сделали в std::unique_ptr? (2014)