2010-08-16 6 views
0

De quelle signature de type aurais-je besoin si je voulais déterminer le type retourné par l'opérateur indice d'un tableau (T) en utilisant boost? Notez que les tableaux pour lesquels je voudrais utiliser ceci ne contiennent pas typedefs et sont tiers.Comment déterminer le type de retour de l'opérateur d'indice d'un type de tableau donné avec boost?

Exemple. Je veux déterminer que:

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

Quelque chose comme

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

? J'ai toujours eu des problèmes avec l'opérateur [] dans les signatures de type. : |

Merci!

Répondre

0

Peut-être que vous pouvez utiliser 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; 

En C++ 0x, vous devriez pouvoir utiliser decltype(tmp[0]) i;


En réponse au commentaire. Peut-être que vous pouvez bidouiller à ne pas supprimer const et des références avec quelque chose comme ça:

#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'; 
} 

Vous aurez besoin probablement de trouver quelque chose pour const surcharge, ainsi que deux pas des spécialisations pour les tableaux/pointeurs.

+0

On dirait que cela aurait pu être utile si BOOST_TYPEOF/_TPL incluait la référenciation et cv-qualification dans le résultat .. Si proche, putain. – Geoff

+0

@Geoff ne pouvez-vous pas utiliser type_traits 'is_const',' is_volatile', et 'is_reference' pour trouver la référence et cv-qualification? Utilisez ensuite cela dans le cadre d'une spécialisation de template pour déclarer quelque chose comme 'typedef typename const BOOST_TYPEOF (get_subscript_type (& T :: opérateur [])) :: type type;' ou 'typedef typename BOOST_TYPEOF (get_subscript_type (& T :: opérateur [])) :: type & type; '? – KitsuneYMG