c++ - 默认模板功能参数

标签 c++ templates

我想设计一组函数,例如minmaxstddev,它们可以支持用户定义的类型。我打算做的是让用户将 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 时>Extractor,它们不需要显式提供InputIterator的类型。

有没有办法让代码编译通过,同时自定义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/

相关文章:

c++ - C++03 中的模板函数返回类型推导

c++ - 如何使特征接受参数包?

c++ - 有点奇怪的C++代码

c++ - 我应该将关键字 `extern` 添加到常量的定义中以在源文件之间共享吗?

c++ - C++ 的效率

c++ - 如何在此 C++ 示例中正确使用枚举?

c++ - 类内模板化类的 Typedef

C++:在派生类的对象上调用函数的函数调用优先级规则?

c++ - 如何将对象数组作为参数传递给模板

javascript - Backbone.js:将事件绑定(bind)到模板按钮