为什么我不能在模板中返回数组的第一个元素?

tem*_*boy 11 c++ arrays templates

考虑:

#include <iostream>

template <typename T> T getArray( T &arr ) {
    return *arr;
}

int main() {

    int a[] = {5, 3, 6};

    std::cout << getArray(a);

}
Run Code Online (Sandbox Code Playgroud)

它假设打印数组中的第一个元素但它不起作用.这是为什么?

它给了我错误:

error: no matching function for call to 'getArray(int [3])'
Run Code Online (Sandbox Code Playgroud)

GMa*_*ckG 12

类型aint[3],所以类型Tint[3].无法从函数返回数组.

在C++ 11中,您可以这样做:

template <typename T>
auto getArray(T &arr) -> decltype(*arr)
{ 
    return *arr; 
} 
Run Code Online (Sandbox Code Playgroud)

或这个:

// requires <type_traits>

template <typename T>
typename std::remove_extent<T>::type& getArray(T &arr)
{ 
    return *arr; 
} 
Run Code Online (Sandbox Code Playgroud)

在C++ 03中你可以做到这一点,但它并不完全相同:

template <typename T>
T getArray(T* arr /* not really an array */)
{ 
    return *arr; 
} 
Run Code Online (Sandbox Code Playgroud)

要么:

template <typename T, std::size_t N>
T getArray(T (&arr)[N])
{ 
    return *arr; 
} 
Run Code Online (Sandbox Code Playgroud)

  • 如果OP想知道如何定义`remove_extent`:`template <class T> struct remove_extent {typedef typename T type; }; template <class T,size_t N> struct remove_extent <T [N]> {typedef typename T type; };` (2认同)