Как определить тип возврата оператора индексации данного типа массива с boost?
Какую сигнатуру типа мне нужно использовать, если я хочу определить тип, возвращаемый оператором индекса (массива) с использованием boost? Обратите внимание, что массивы, для которых я буду использовать это, не содержат typedefs и являются сторонними.
Пример. Я хочу определить, что:
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;
};
? У меня всегда были проблемы с оператором [] в типовых сигнатурах.:|
Спасибо!
1 ответ
Возможно, вы могли бы использовать BOOST_TYPEOF
/ BOOST_TYPEOF_TPL
: http://www.boost.org/doc/libs/1_35_0/doc/html/typeof/refe.html
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';
}
Вам, вероятно, также понадобится придумать что-нибудь для константных перегрузок, а также добавить специализации для массивов / указателей.