【发布时间】:2014-11-28 23:10:27
【问题描述】:
更新
我在 STL 不可用的环境中处理一些容器代码。我试图概括我的迭代器以减少代码重复。我遇到过这样一种情况,我有一个可以包含对象或指向对象的指针的容器。我在尝试编译以下(人为的)代码时遇到了编译问题:
struct Object
{
};
template<typename Container, typename T>
struct IteratorBase
{
IteratorBase( Container * container, T curr ) : _container( container ), _curr( curr ) { }
Container * _container;
T _curr;
T & GetValue() const { return _curr; }
void Invalidate() { _curr = NULL; }
};
template<typename T>
struct Container
{
typedef typename T * Type;
typedef IteratorBase<Container<T>, Type> Iterator;
Iterator GetIterator() { return Iterator( this, storage ); }
T storage[10];
};
int main(int argc, char* argv[])
{
Container<Object> containerByAddress;
const Object* pA = containerByAddress.GetIterator().GetValue();
return 0;
}
错误是
error C2440: 'return' : cannot convert from 'Object *const ' to 'Object *&'
while compiling class template member function 'Object &IteratorBase<Container,T>::GetValue(void) const'
所以我做了一些更改,通过使用以下方法推断 T 的类型来更改返回值的方式:
template<typename T>
struct DetermineReturnType
{
typedef T & ReturnType;
};
template<typename T>
struct DetermineReturnType<T*>
{
typedef T * ReturnType;
};
template<typename Container, typename T>
struct IteratorBase
{
IteratorBase( Container * container, T curr ) : _container( container ), _curr( curr ) { }
Container * _container;
T _curr;
typedef typename DetermineReturnType<T>::ReturnType ReturnType;
ReturnType GetValue() const { return _curr; }
void Invalidate() { _curr = NULL; }
};
现在我的迭代器使用 & 或 * 基于 T。
但我的问题是 - 这是一个合理的解决方案吗?有什么办法可以解决这个问题吗?
请注意,我不能使用 STL、Boost 或最新版本的 C++,因为这是一个已有几年历史的嵌入式系统。
感谢您的任何见解。
【问题讨论】:
-
Object * & GetValue();如果您的指针以与值相同的方式存储,则应该没问题。为什么说是临时的,不能这样退? -
我认为没有理由在这里使用专业化。如果
T是Object*,那么T& GetValue()将已经是Object*& GetValue()。 -
是的,你们都是对的。当我扩展我的示例时,一切正常,但是在实际代码的密集丛林中,这并没有被编译,而且它似乎与 *'s 和 &'s 一个 const 有关。可能我在错误的地方有 const 。我会做更多的挖掘和回信。
-
@Captain Obvlious - 所以 Object * a = iterator.GetValue() where T is Object* 没有问题,即使函数签名是 Object * & Iterator::GetValue() ?跨度>
-
正确。您只是返回对容器中元素的引用并将引用的值复制到
a。它是一个指针值这一事实无关紧要,它仍然是一个值。 FWIW 如果您正确实现了GetValue(),则指针不应该是右值(临时)。
标签: c++ templates reference iterator return-type