我在教C++自己的模板编程,所以我的一些假设可能是错误的 - 请纠正我,如果你看到任何错误。专门设计一个包含模板模板的模板
我想使用STL列表作为函数的模板参数。该函数应该用于各种数据类型,所以我在其原始声明中将函数定义为template<class T>
而不是template<template<> class T>
。我现在想专门支持模板类。
template<class T>
void function(T param)
{
// do something with T
}
template<template <class T, class Allocator> class listPlaceholder>
void function(std::list<T, Allocator> param)
{
// do something with every element in param (I actually need to know it's a list)
std::list<T, Allocator>::iterator current = param.begin();
std::list<T, Allocator>::iterator end = param.end();
do {
function<T>(*current);
} while (++current != end);
}
的问题是,当我尝试编译此代码(GCC下),它说,T
和Allocator
未在范围内定义。我的主要问题是“我如何专注于模板类?”其次,如果可能的话,“我如何提取模板模板参数?”。
如前所述,我正在学习模板编程,因此欢迎使用明显的解决方案。
我使用'listPlaceholder'和'std :: list'为了专门为'std :: list's,同时保持其他两个参数模板类的任何特化打开(例如我也使用'std :: pair') 。正如我向其他评论者提及的那样,额外的模板参数是否意味着您不能在原始函数中使用此修改后的功能。 – fuseinabowl
@fuseinabowl,啊我明白了。那么,因为你没有专精,所以你不需要为任何更专业化而“保持开放”。无论如何,您无法为参数化的'std :: list '专门化一个函数模板,因为这需要部分特化,而功能模板则无法完成。你可以在里面粘贴'std :: list',稍后为其他类型添加更多的重载。编译器将在一次调用中选择最专业的模板(即最接近参数的模板)。 –
我尝试了第一个 - 我不知道如何编写代码。你能给我一个模板函数声明的代码示例吗? – fuseinabowl