2010-11-01 70 views
2

您可以使用模板來查找數組的長度。使用模板獲取數組的大小和結束地址

template<typename T, size_t N> 
size_t arraylen(T(&)[N]) 
{ return N; } 

我想進一步採取這個想法。

struct Foo 
{ 
    template< typename T, size_t N > 
    Foo(/* ??? */) : ptr(?), size(?) { } 

    char* ptr; 
    size_t size; 
}; 

int main() 
{ 
    Foo foo("test"); 

    const char bar[] = "test2"; 
    Foo foo2(bar); 

    const char* baz = bar; 
    Foo foo3(baz); // compiler error. 
} 

但是,對於我的生活,我無法獲得編譯的語法。我想我缺少的一部分是我不太瞭解T(&)[N]的含義。

T(&)[N]是什麼意思?

我該如何允許訪問數組的地址,同時仍然使用模板來獲取數組的大小?

回答

6
struct Foo 
{ 
    template< typename T, size_t N > 
    Foo(T(&array)[N]) : ptr(array), size(N) { } 

    const char* ptr; 
    size_t size; 
}; 

array是對N T數組的引用。原始代碼也是如此,但參數沒有給出名稱。

但是這真的不是在編譯時計算地址。如果你仔細想想,你會意識到這是不可能的。如果堆棧地址是固定的,遞歸(和其他許多算法)將無法工作。

注意,最後一行:

Foo foo3(baz); 

仍然不會因爲baz工作是一個指針不是一個數組。

+0

我應該改變標題。在這個問題中,我沒有提到編譯時間。另外我想'baz'示例失敗。 – 2010-11-01 22:53:15

相關問題