2010-08-16 39 views
0

如果我想確定使用boost的數組(T)的下標運算符返回的類型,我需要使用哪種類型的簽名?請注意,我將使用它的數組不包含typedefs並且是第三方。如何確定給定數組類型的下標運算符的返回類型是否帶有boost?

例子。我想確定:

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

?我一直在操作符[]中輸入簽名。 :|

謝謝!

回答

0

也許你可以使用BOOST_TYPEOF/BOOST_TYPEOF_TPLhttp://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;


在回答評論。或許你可以欺騙它不能去除常量和參考用類似的東西:

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

你可能還需要拿出一些爲常量重載,以及投特數組/指針。

+0

看起來像是BOOST_TYPEOF/_TPL包含引用和cv-qualification作爲結果的一部分可能是有用的。如此接近,該死的。 – Geoff 2010-09-14 14:12:38

+0

@Geoff不能使用type_traits'is_const','is_volatile'和'is_reference'來查找引用和cv-qualification?然後使用它作爲模板特化的一部分來聲明類型爲typedef typename const BOOST_TYPEOF(get_subscript_type(&T :: operator []))type type;或typedef typename BOOST_TYPEOF(get_subscript_type(&T :: operator []) ):: type & type;'? – KitsuneYMG 2010-09-14 15:05:29

相關問題