0

如果我想使用 boost 确定数组 (T) 的下标运算符返回的类型,我需要使用什么类型签名?请注意,我将使用它的数组不包含 typedef 并且是第三方的。

例子。我想确定:

SomeArray<int> tmp(1);  
int& somevalue = tmp[0]; //would equate  
typename subscript_result<SomeArray<int> >::type somevalue = tmp[0];

就像是

template<class T>
struct subscript_result
{
  typedef boost::result_of<T::operator[](typename T::difference_type)>::type type;
};

? 我一直在类型签名中遇到 operator[] 的问题。:|

谢谢!

4

1 回答 1

0

也许你可以使用BOOST_TYPEOF/ BOOST_TYPEOF_TPL: http: //www.boost.org/doc/libs/1_35_0/doc/html/typeof/refe.html#typeof.typo

BOOST_TYPEOF(tmp[0]) i;

在 C++0x 中,您应该能够使用decltype(tmp[0]) i;


在回答评论。也许你可以欺骗它不删除 const 和引用类似的东西:

#include <boost/typeof/typeof.hpp>

template <class T>
struct identity
{
    typedef T type;
};

template <class T>
struct subscript_result
{

    template <class Result, class Obj, class Arg>
    static identity<Result> get_subscript_type(Result (Obj::*)(Arg));

    typedef BOOST_TYPEOF(get_subscript_type(&T::operator[])) aux;
    typedef typename aux::type type;
};

#include <vector>
#include <iostream>

template <class Container>
void foo(Container& c)
{
    typename subscript_result<Container>::type t = c[0];
    ++t;
}

int main()
{
    //prove that foo gets a reference to vector<int>
    std::vector<int> vec(1);
    foo(vec);
    std::cout << vec[0] << '\n';
}

您可能还需要为 const 重载想出一些东西,以及为数组/指针提供专门化。

于 2010-08-16T17:58:57.543 回答