2011-04-05 72 views
3

可能重複:
How does this 「size of array」 template function work?大小 - 作爲一個函數的C數組?

是否有實現NARR沒有宏C++(C++ 0x中)的可能性?

const static pair<string,int> data[] = { 
    {"Montag",1}, {"Dienstag",2}, {"Mittwoch",3}, {"Donnerstag",4}, 
    {"Freitag",5}, {"Samstag",6}, {"Sonntag",7} 
}; 
#define NARR(A) (sizeof(A)/sizeof(*A)) 
const static map<string,int> german_weekdays(data, data+NARR(data)); 

一個簡單的功能是不可能的,因爲那樣的話[]失去了它的尺寸信息和成爲另一種poiner:

size_t narr(sometype arr[]) { /* won't work */ } 

模板?超載?魔法?

+1

http://blogs.msdn.com/b/the1/archive/2004/05/07/128242.aspx – 2011-04-05 07:57:14

+0

對不起,愚蠢的問題也許是,但什麼是「NARR」代表比(其它「小丑」在德國)? – 2011-04-05 08:01:04

+0

Duplicate:http://stackoverflow.com/questions/3368883/how-does-this-size-of-array-template-function-work/ – GManNickG 2011-04-05 08:38:30

回答

9

,它在C++可能:

template< typename T, std::size_t Size > 
std::size_t size(const T (&)[Size]) 
{ 
    return Size; 
} 

在宏觀解決方案的這個優勢是,如果你試圖將一個指針傳遞給該編譯器會咳嗽了一個討厭的錯誤消息。

+0

還有一種方法可以讓編譯時間保持不變,但它讓我頭腦轉動,所以每次看到它時都會努力忘記它。它確實需要一個可用的宏。 – sbi 2011-04-05 07:53:49

+0

http://stackoverflow.com/questions/3368883/how-does-this-size-of-array-template-function-work/3368894#3368894 – GManNickG 2011-04-05 08:07:59

+0

@GMan:啊,不記得那一個。哇,它被封爲另外兩個人的玩偶,其中第二個被封爲第一個玩偶......這真是一個起源。我們不應該讓這些常見問題條目之一? – sbi 2011-04-05 09:11:53

4

在C++ 0X:

#include <iterator> 

const static map<string,int> german_weekdays(data, std::end(data)); 

你也可以使用std::begin(data)如果你喜歡,爲對稱或一般性詞語[*]。並可能你可以使用一個初始化列表而不是數組反正...

[*]儘管全一般性詞語,你應該做的:

using std::begin; 
using std::end; 
begin(data), end(data); 

的原因是,新的「基於範圍的for循環「語法相當於無限制地使用beginend,但使用std作爲ADL的關聯名稱空間。因此,與std::swap一樣,類型的作者可能會提供beginend函數,這些函數可通過ADL找到。他們可能應該提供begin()end()成員函數,其中std::beginstd::end將會調用。但是,如果他們提供了一些基於範圍的工作,並且不適用於你的代碼,那麼你就必須有一個誰應該改變的論點。

+0

我認爲與ADL和基於範圍的 - 可能會有變化,最近。我們會看到。我不太喜歡''使用',我寧願具體在哪裏我需要的項目。但無論如何:關於使用'begin()'和'end()'的重要提示,我(顯然)在這種情況下沒有想到。大。 – towi 2011-04-05 10:22:31

+0

@towi:是的,我沒有檢查過FDIS,最後它是編程約定,它決定了什麼類可以提供,而不是單獨的標準。重要的創新之處在於完全可以使用「開始」和「結束」自由函數,這就是允許他們爲數組工作的原因。 – 2011-04-05 10:29:39

2

我現在不能測試這個,因爲我已經離開了一段時間,最新的GCC 4.6剛剛拒絕編譯,但是constexpr應該對這個問題做簡短的工作。當然,最好用史蒂夫的建議來回避這個問題。

template< typename T, size_t N > 
constexpr size_t narr(T const (&)[ N ]) 
    { return N; } 
+0

要獲得最新的gcc版本,通常您可以下載mingw-w64的每日編譯快照。它目前甚至包含gcc4.7主幹。即使對於Linux主機,它們也是預編譯的。只需解壓縮它們並運行二進制文件。生成的代碼可以運行在Windows或Wine上。沒什麼比這更容易:) – 2011-04-05 14:22:40

+0

@Johannes:我的樹是爲10月份的libstdC++ - v3貢獻的,所以我需要弄清楚我需要在哪個分支上然後重新啓動,如果我現在真的有時間了。另外,我在Mac OS/Darwin上。無論如何,儘管如此,並且很高興看到你還在這裏! – Potatoswatter 2011-04-05 15:11:06

相關問題