我正在尝试编写一个简单的"Skip Iterator",其中包含要跳过的元素数量的模板参数:
template <typename T, typename Iter, int Skip>
class SkipIterator
{
public:
SkipIterator(Iter baseIter) :
baseIter_(baseIter)
{
}
void operator++()
{
baseIter_ += Skip;
}
T &operator*()
{
return *baseIter_;
}
private:
Iter baseIter_;
};
Run Code Online (Sandbox Code Playgroud)
我希望能够推断出这样的基数Iter和T类型:
std::vector<double> dataFromSomewhere;
SkipIterator<3> skipper(dataFromSomewhere.begin())
Run Code Online (Sandbox Code Playgroud)
但是编译器(VS2010)给出了"模板参数太少"的错误.
有没有办法做到这一点?
您可以提供帮助函数:
#include <iterator>
template <int Skip, typename Iter>
SkipIterator<typename std::iterator_traits<Iter>::value_type, Iter, Skip>
make_skip_iterator(Iter it)
{
return SkipIterator<
typename std::iterator_traits<Iter>::value_type, Iter, Skip
>(it);
}
Run Code Online (Sandbox Code Playgroud)
你会用这种方式:
std::vector<double> dataFromSomewhere;
auto skipper = make_skip_iterator<3>(dataFromSomewhere.begin());
Run Code Online (Sandbox Code Playgroud)
这是一个实例.
请注意,由于返回类型推导,上面的帮助函数的C++ 14版本看起来更好(至少在签名中):
template <int Skip, typename Iter>
auto make_skip_iterator(Iter it)
{
return SkipIterator<
typename std::iterator_traits<Iter>::value_type, Iter, Skip
>(it);
}
Run Code Online (Sandbox Code Playgroud)
当然是现场的例子.
模板参数推导仅在模板函数调用中发生,从不在涉及类模板名称的变量声明中发生.此外,如果您想要推断一些但不是所有参数,那么您想要推导出的参数必须在最后.
总而言之,您正在寻找这样的东西:
template <int Skip, typename Iter>
auto make_skipper(Iter it)->SkptIterator<decltype(*it), Iter, Skip> {
return SkptIterator<decltype(*it), Iter, Skip>(it);
}
auto skipper = make_skipper<3>(dataFromSomewhere.begin());
Run Code Online (Sandbox Code Playgroud)