我在Debian上使用gcc 4.4.请考虑以下代码.
#include <map>
#include <string>
using std::map;
using std::string;
// Args lets the user specify additional explicit template arguments
template <typename T,
template <typename T, typename... Args> class C,
typename... Args>
C<T, Args...> foo()
{
C<T, Args...> x;
return x;
}
int main(void)
{
map<string, int> a = foo<string, map, int>();
}
Run Code Online (Sandbox Code Playgroud)
所以,这里的想法是T匹配string,C匹配map和模板参数包Args匹配int.我可能有一些错误的语法,如果是这样,请更正.特别是,如果希望第一个模板参数class C匹配T而其余模板参数匹配模板参数包Args,template <typename T, typename... Args> class C …
我试图用一个模板化的类来替换我的所有"获取/发布"RAII类(我现在每种资源都有一个).获取的一般形式是一些类型是Acquire(),一些是Acquire(p1),一些是Acquire(p1,p2)等.Release也是如此.但是,如果资源是使用参数获取的,则需要使用相同的参数释放它.
我想我可以使用可变参数模板,将参数存储在元组中.当然,我已经贬低了语法.有人可以帮忙吗?
#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; …Run Code Online (Sandbox Code Playgroud) 我从这个答案中看到了这段代码的片段,我似乎无法理解模板和类型名的排列如何创建main()中显示的最终函数调用.
特别是,可变参数模板模板的安排和std :: forward的使用让我很困惑.
任何人都可以打破这段代码,以便我能更好地理解它吗?
#include <utility>
template <template <typename...> class TemplateClass, typename... Args>
TemplateClass<Args...> make(Args&&... args)
{
return TemplateClass<Args...>(std::forward<Args>(args)...);
}
int main()
{
make<std::pair>(1, 2);
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.