C++ 错误:推断类类型';元组';函数内返回类型
我在做什么 我在3年后练习C++。我需要快速而广泛地学习,所以我试图解决的这个例子对你来说可能很奇怪 我使用的是C++ 错误:推断类类型';元组';函数内返回类型,c++,tuples,c++20,C++,Tuples,C++20,我在做什么 我在3年后练习C++。我需要快速而广泛地学习,所以我试图解决的这个例子对你来说可能很奇怪 我使用的是c++20,gcc10.2 我想做一个pythonic枚举函数 接受任何容器 产生std::tuple 其中T是容器中的项目类型 我想尝试应用pythonic range作为enumerate的参数 采取(整数开始、整数结束、整数步) 从开始到结束每个步骤 范围(不是我的代码,我只添加了步骤功能) 我猜这是在抱怨您没有告诉我元组包含的类型。但问题是,我不知道迭代器包含什么类型。
c++20
,gcc10.2
我想做一个pythonic枚举函数
- 接受任何
容器
- 产生
std::tuple
- 其中
是容器中的项目类型T
enumerate
的参数
- 采取
(整数开始、整数结束、整数步)
- 从
到开始
每个结束
步骤
步骤
功能)
我猜这是在抱怨您没有告诉我元组包含的类型。但问题是,我不知道迭代器包含什么类型。我如何判断返回类型是std::tuple
感谢您阅读这个冗长的问题。我认为,对于枚举迭代器
,您可能希望其模板类型T
是“基本元素类型”,而不是某种复合的“迭代类型”
例如,如果选择使用原始内存指针实现迭代,则名为iterator
的enumerate\u迭代器的数据成员将具有类型T*
(而不是其当前的T
类型)
然后,在这种情况下,操作符*()
的定义将被编程为返回类型为std::tuple
“不是我的代码”,这是一个糟糕的代码。它甚至不是一个有效的C++范围。如果你不能将迭代器用于任何事情,那么使用迭代器是没有意义的。
template <typename T>
class range_iterator;
template <typename T>
class range_impl
{
const T start_;
const T stop_;
const T step_;
public:
range_impl(T start, T stop, T step) : start_{start}, stop_{stop}, step_{step} {};
range_impl(T start, T stop) : start_{start}, stop_{stop}, step_{1} {};
range_impl(T stop) : start_{0}, stop_{stop}, step_{1} {};
range_iterator<T> begin() const
{
return range_iterator<T>{start_, step_};
}
range_iterator<T> end() const
{
return range_iterator<T>{stop_, step_};
}
};
template <typename T>
class range_iterator
{
T current_;
const T step_;
public:
range_iterator(T init, T step) : current_{init}, step_{step} {};
range_iterator<T> &operator++()
{
current_ += step_;
return *this;
}
bool operator!=(const range_iterator<T> &rhs) const
{
return current_ != rhs.current_;
}
T operator*() const
{
return current_;
}
};
template <typename T>
range_impl<T> range(const T start, const T stop, const T step)
{
return range_impl<T>(start, stop, step);
}
template <typename T>
range_impl<T> range(const T start, const T stop)
{
return range_impl<T>(start, stop);
}
template <typename T>
range_impl<T> range(const T stop)
{
return range_impl<T>(stop);
}
#include <iostream>
int main()
{
for(auto i: range(0, 100 2)
{
std::cout << i << std::endl;
}
}
template <typename T>
class enumerate_iterator;
// Here, T should be a type of a container that contains type X
template <typename T>
class enumerate_impl
{
T impl;
public:
enumerate_impl<T>(T impl) : impl{impl} {/* empty */};
enumerate_iterator begin() const
{
return enumerate_iterator{impl.begin()};
}
enumerate_iterator end() const
{
return enumerate_iterator{impl.end()};
}
};
// Here, T should be a type of a iterator, I think. Confused myself.
template <typename T>
class enumerate_iterator
{
T iterator;
int i;
public:
enumerate_iterator(T iterator) : iterator{iterator}, i{0} {/* empty body */};
enumerate_iterator<T> &operator++()
{
i++;
iterator++;
return *this;
}
bool operator!=(const enumerate_iterator<T> &rhs) const
{
return iterator != rhs.iterator;
}
std::tuple operator*() const
{
return {i, *iterator};
}
};
template <typename T>
enumerate_impl<T> enumerate(T impl)
{
return enumerate_impl<T>{impl};
}
#include <iostream>
int main()
{
for (auto &[i, j] : enumerate(range(0, 100, 2)))
{
std::cout << i << " " << j << std::endl;
}
}
utility.cpp:186:20: error: deduced class type 'tuple' in function return type
186 | std::tuple operator*() const