【发布时间】:2018-12-09 11:38:12
【问题描述】:
假设我有一个返回一系列值的接口。这个接口的实现可以使用不同的容器来提供这些数字。
class MyClassI
{
public:
virtual std::pair<std::vector<int>::iterator, std::vector<int>::iterator> Numbers() const = 0;
}
class MyClassC : public MyClassI
{
public:
virtual std::pair<std::vector<int>::iterator, std::vector<int>::iterator> Numbers() const
{ return std::make_pair(numbers.begin(), numbers.end(); }
private:
std::vector<int> numbers;
}
我想知道是否有办法将容器类型从迭代器中“衰减”掉。
class MyClassI
{
public:
virtual std::pair<decayed_iterator<int>, decayed_iterator<int>> Numbers() const = 0;
}
我当然可以将原始迭代器放在堆上,然后我可以用模板类包装该指针,以提供值类型作为迭代器。
我想知道在 boost 中是否已经有类似的东西或其他东西。
我可以想象像 std/boost 函数这样的东西,其中可调用对象被衰减(如果它是函数或结构),并且“状态”部分存储在对象内部(如果它足够小),以避免堆分配- 如果可能的话。
【问题讨论】:
-
你的意思是多态迭代器类型吗?换句话说,一个迭代器基类(或基类模板)和不同容器类型的不同派生迭代器?
-
是的。它类似于 C# 中的 IEnumerator
,因此它不会泄露比需要更多的实现细节(容器类型)。我需要它,以便可以将其用作方法返回值或将其用作方法参数。最好我不想让这些方法成为模板函数。 -
你可以创建它!基类和派生类模板......