使用[]运算符从指向std :: array <t,n =“”>的指针获取类型?</t,>

时间:2013-03-03 01:10:12

标签: c++ templates c++11 return

我的代码中有一个与std::array<T1, N>和函数相似的类:

template <class T2>
inline void f(T2* const myarray)
{
    std::pair<double, /*SOMETHING*/> x;
}

假设T2*是指向我的班级的指针,与std::array<T1, N>相当,我想知道我要写什么而不是/*SOMETHING*/来从T1获取[] myarray的{​​{1}}运营商?

注意:我没有要求更聪明的方法从指针std::array获取类型。

1 个答案:

答案 0 :(得分:3)

这对我有用:

#include <type_traits>
#include <array>
#include <utility>

template <class T2>
inline void f(T2* const myarray)
{
    std::pair<double, typename T2::value_type> x;
    static_assert(std::is_same<decltype(x.second), int>::value, "");
}

int
main()
{
    std::array<int, 2> a;
    f(&a);
}

如果您的“类似数组”的类模板没有value_type,则以下内容也应该有效:

std::pair<double, typename std::remove_reference<decltype((*myarray)[0])>::type> x;

但是只是fyi,const-qualified参数通常不被使用,如果你碰巧返回参数(如),在C ++ 11中甚至会是一个悲观的:

return myarray;

虽然在这种情况下myarray是一个指针,但在这种情况下它是const并不重要。

如果您的意思是:

inline void f(T2 const* myarray)

(指向const T2的指针,而不是指向const的{​​{1}}指针

然后上面的食谱需要稍作调整:

T2

如果您的“类似数组”的类模板确实有std::pair<double, typename std::remove_const< typename std::remove_reference< decltype((*myarray)[0]) >::type >::type> x; ,那么第一个建议是:

value_type

无论std::pair<double, typename T2::value_type> x; 在哪里都有效。