Sto tentando di sostituire tutte le mie classi RAII "Acquire/Release" (ne ho una per ogni tipo di risorsa al momento) con una sola classe basata su modelli. La forma generale di acquisizione è che alcuni tipi sono Acquire(), alcuni sono Acquisisci (p1), alcuni sono Acquisisci (p1, p2), ecc. Lo stesso è vero per il Release. Ma se una risorsa è acquisita con parametri, allora deve essere rilasciata con quegli stessi parametri.Modello RAII per acquisizione/rilascio con modelli variadici
Penso di poterlo fare con i modelli variadic, memorizzando gli argomenti in una tupla. Ovviamente sono caduto nella sintassi. Qualcuno può aiutare?
#include <tuple>
template<class T, typename... Args>
class Raii
{
public:
Raii(T * s, Args&& ... a) : subect(s), arguments(a)
{
subject->Acquire(arguments);
}
~Raii()
{
subject->Release(arguments);
}
private:
T subject;
std::tuple<Args...> arguments;
};
class Framebuffer
{
public:
void Acquire() {}
void Release() {}
};
class Sampler
{
public:
void Acquire(int channel) {}
void Release(int channel) {}
};
class Buffer
{
public:
void Acquire(int target, int location) {}
void Release(int target, int location) {}
};
int main(void)
{
Framebuffer f;
Sampler s;
Buffer b;
auto b1 = Raii(&f);
{
auto b2 = Raii(&s, 10);
{
auto b3 = Raii(&b, 10, 20);
{
}
}
}
return 0;
}
possibile duplicato del [mascherina mascherine variadic e spedizioni perfetta] (http: // StackOverflow .com/questions/6486432/variadic-template-templates-and-perfect-forwarding) –
Fa touch su forwarding perfetto ma questo è un esempio pratico, molto più semplice di quello che è descritto su quel thread. Quindi voto di non chiudere, almeno finché non funziona. – Robinson