我的代码中有一个与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
获取类型。
答案 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;
在哪里都有效。