float - c++ int array length



有人可以解釋這個模板代碼,它給我一個數組的大小? (3)

好吧,首先你必須明白,試圖從數組中獲取一個值可以給你一個指向它的第一個元素的指針:

int a[] = {1, 2, 3};
int *ap = a; // a pointer, size is lost
int (&ar)[3] = a; // a reference to the array, size is not lost

引用引用使用其確切類型或基類類型的對象。 關鍵是模板通過引用獲取數組。 C ++中不存在作為參數的數組(不是對它們的引用)。 如果給一個參數一個數組類型,它將是一個指針。 因此,當我們想知道傳遞的數組的大小時,使用引用是必要的。 自動推導出大小和元素類型,通常是函數模板的情況。 以下模板

template<typename T, size_t n>
size_t array_size(const T (&)[n]) {
    return n;
}

使用我們之前定義的數組調用a將隱式實例化以下函數:

size_t array_size(const int (&)[3]) {
    return 3;
}

哪個可以這樣使用:

size_t size_of_a = array_size(a);

我之前有一個變化[編輯:結果有人已經有了相同的想法]這可以在編譯時確定一個值。 它不是直接返回值,而是根據n給模板一個返回類型:

template<typename T, size_t n>
char (& array_size(const T (&)[n]) )[n];

您說如果數組有n元素,則返回類型是對大小為n且元素類型為char的數組的引用。 現在,您可以獲得傳遞數組的編譯時確定大小:

size_t size_of_a = sizeof(array_size(a));

因為具有n元素的char數組的sizeof為n ,所以也會給出給定數組中元素的數量。 在編譯時,你可以做到

int havingSameSize[sizeof(array_size(a))];

因為函數永遠不會被實際調用,所以不需要定義它,因此它沒有實體。 希望我能稍微澄清一下這個問題。

https://ffff65535.com

這個問題在這裡已有答案:

template<typename T, size_t n>
size_t array_size(const T (&)[n])
{
    return n;
}

我沒有得到的部分是這個模板函數的參數。 當我傳遞數組時,數組會發生什麼? n是數組中元素的數量?


對於我們這些沒有“constexpr”的人來說,將結果作為編譯時const得到一種奇怪的方法:

#include <iostream>

namespace
{

    template <size_t V>
    struct helper
    {
        enum
        {
            value = V
        };
    };


    template<typename T, size_t Size>
    auto get_size(T(&)[Size]) -> helper < Size >
    {
        return helper < Size >() ;
    }

    template<typename T>
    struct get_value
    {
        enum
        {
            value = T::value
        };
    };

}

int main()
{
    std::cout << get_value<decltype(get_size("Foo bar baz"))>::value;
}

陣列沒有任何反應。 它是一個未使用的參數,用於解析模板函數的簽名。

它也不能用作模板參數,但這是一個單獨的參數。





size