私は "Acquire/Release" RAIIクラス(現時点では各種類のリソースごとに1つずつ)を1つのテンプレートクラスに置き換えようとしています。取得の一般的な形式は、Acquire()、Acquire(p1)、Acquire(p1、p2)などのいくつかのタイプがあります。Releaseについても同様です。しかし、リソースがパラメータで取得された場合、それらは同じパラメータで解放する必要があります。バリエーションテンプレートを使用したアクイジション/リリース用のRAIIパターン
私は多次元テンプレートでこれを行うことができ、引数をタプルに格納すると思います。私はもちろん構文に落ちた。誰も助けることができますか?
#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;
}
可能重複します(http:// stackoverflowの.com/questions/6486432/variadic-template-templates-and-perfect-forwarding) –
これは完璧なフォワーディングに触れていますが、これはそのスレッドで説明されているものよりはるかに単純で実用的な例です。だから、私は少なくともそれが働くまでは閉じないように投票します。 – Robinson