我想设计一组函数,例如min
、max
和stddev
,它们可以支持用户定义的类型。我打算做的是让用户将 Extractor
模板参数传递给这些函数。部分示例代码如下:
template <typename T>
struct DefaultExtractor
{
typedef T value_type;
static T value(T &v){
return v;
}
};
template <
typename Extractor=DefaultExtractor<typename std::iterator_traits<InputIterator>::value_type>, //error
typename InputIterator>
typename Extractor::value_type
foo(InputIterator first, InputIterator last)
{
return Extractor::value(*first);
}
这不会编译,错误消息是“错误:‘InputIterator’未在此范围内声明”,位于 typename Extractor=...
行。
我想将模板 Extractor
放在 InputIterator
之前的原因是,当用户想要使用自定义的 调用
,它们不需要显式提供foo
时>ExtractorInputIterator
的类型。
有没有办法让代码编译通过,同时自定义Extractor
时不需要用户显式提供参数InputIterator
需要。
代码使用g++-4.6.1 -std=c++0x
编译。
最佳答案
虽然我看到您希望将提取器作为模板参数传递,但实际上更典型的是将对象传递给函数。它也更灵活,因为它允许您将额外的状态传递给提取器。
最重要的是,它使处理模板参数变得更加容易:
#include <iterator>
#include <list>
template <typename T>
struct DefaultExtractor
{
typedef T value_type;
static T value(T &v){
return v;
}
};
struct MyExtractor {
typedef int value_type;
static int value(int value) { return value; }
};
template <typename Extractor, typename InputIterator>
inline typename Extractor::value_type
foo(
InputIterator first,
InputIterator last,
const Extractor &extractor
)
{
return extractor.value(*first);
}
template <typename InputIterator>
inline typename DefaultExtractor<
typename std::iterator_traits<InputIterator>::value_type
>::value_type
foo(
InputIterator first,
InputIterator last
)
{
typedef DefaultExtractor<typename std::iterator_traits<InputIterator>::value_type> Extractor;
return foo(first,last,Extractor());
}
int main(int argc,char **argv)
{
std::list<int> l;
// Use default extractor
foo(l.begin(),l.end());
// Use custom exractor.
foo(l.begin(),l.end(),MyExtractor());
return 0;
}
关于c++ - 默认模板功能参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12256420/