我有下一个代码:
template<class RandomIt>
static void SelectionSort(RandomIt first, RandomIt last) {
decltype(*first) res[length];
}
例如,我将此函数称为如下:
int test[] = { 1, 2, 3, 4 };
SelectionSort(std::begin(test), std::end(test));
然后RandomIt
是int*
,不是吗?并decltype(*first)
返回int&
而不是我需要的int
。如何更改它以获得int
类型?有可能吗?
答案 0 :(得分:5)
您可以使用std::iterator_traits
。它有一个名为value_type
的类型,它将为您提供基础类型。对于指针类型T*
,这意味着您获得T
。所以在你的情况下你可以使用
template<class RandomIt>
static void SelectionSort(RandomIt first, RandomIt last) {
typename std::iterator_traits<RandomIt>::value_type res[length];
}
答案 1 :(得分:5)
使用C ++ 11,您可以使用std::remove_reference,如下所示:
typename std::remove_reference<decltype(*first)>::type
或简单地(使用C ++ 14)
std::remove_reference_t<decltype(*first)>