在默认模板“函数参数”上
On Default template Function Parameter
我想设计一组函数,如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);
}
这不会编译,并且typename Extractor=...
的行上的错误消息为"error:'InputIterator'未在此范围内声明"。
我想把模板Extractor
放在InputIterator
之前的原因是,当用户想用自定义的Extractor
调用foo
时,他们不需要显式地提供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;
}
相关文章:
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 当从函数参数中的临时值调用复制构造函数时
- 如何从"decltype()"获取函数参数的数量<funtion>?
- 如何将lambda作为模板类的成员函数参数
- 模板参数推导失败,函数参数/参数不匹配
- 如何在C++中将迭代器作为函数参数传递
- 将函数参数"const char*"转换为"std::string_view"是
- C++ 如何将数组值解压缩为函数参数
- 主函数参数的属性
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- 可变参数函数参数包扩展
- 用户定义的转换不适用于可变参数函数参数?为什么不呢?
- 将可变参数函数参数转发到 std::function 对象
- Push_back可变参数函数参数到向量中
- 基于参数函数参数类型重载函数模板
- C++11 可变参数::函数参数