Я пытаюсь реализовать что-то похожее на python с оператором на С++. Поскольку я планирую использовать его в основном с Qt -OpenGL, методы называются bind
иrelease
(в питоне __enter__
,__exit__
).
Код, который я придумал:
заголовок:
#include
#include
class With
{
public:
class A
{
public:
virtual ~A() { }
};
template
class B : public A
{
public:
B(T& _t) : t(_t)
{
t.bind();
}
virtual ~B()
{
t.release();
}
T& t;
};
template
With(Args&... args)
{
set(args...);
}
~With();
template
void set(T& t, Args&... args)
{
set(t);
set(args...);
}
template
void set(T& t)
{
a.push_back(dynamic_cast(new B(t)));
}
std::vector a;
};
cpp:
With::~With()
{
for (auto it = a.begin(); it != a.end(); ++it)
{
delete *it;
}
}
Использование:
class X
{
public:
void bind() { std::cout << "bind x" << std::endl; }
void release() { std::cout << "release x" << std::endl; }
};
class Y
{
public:
void bind() { std::cout << "bind y" << std::endl; }
void release() { std::cout << "release y" << std::endl; }
};
int main()
{
X y;
Y y;
std::cout << "start" << std::endl;
{
With w(x, y);
std::cout << "with" << std::endl;
}
std::cout << "done" << std::endl;
return 0;
}
Вопросы:
class A
и class B
кажется немного неуклюжим. Есть ли лучшая альтернатива?&&
вместо &
? Это сделало бы возможным использование временных объектов (, например.With w(X(), y);
)