gpt4 book ai didi

c++ - 在默认模板函数参数上

转载 作者:搜寻专家 更新时间:2023-10-31 01:52:41 24 4
gpt4 key购买 nike

我想设计一组函数,如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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com