2010-09-15 72 views
0

我有一個很小的代碼位從做這個庫:奇怪的#define模板中?

#define VMMLIB_ALIGN(var) var 

template< size_t M, typename T = float > 
class vector 
{ 

... 

private: 
// storage 
VMMLIB_ALIGN(T array[ M ]); 

}; 

而且你可以通過做

//(vector<float> myVector) 
myVector.array; 

沒有括號或任何調用它。

什麼?


在閱讀答案後,看起來我應該做更多的期待。 XCode的「跳轉到定義」只給我一個結果。搜索庫給了我另一個:

#ifndef VMMLIB_CUSTOM_CONFIG 
# ifndef NDEBUG 
# define VMMLIB_SAFE_ACCESSORS 
# endif 
# define VMMLIB_THROW_EXCEPTIONS 
# ifdef VMMLIB_DONT_FORCE_ALIGNMENT 
# define VMMLIB_ALIGN(var) var 
# else 
# ifdef __GNUC__ 
#  define VMMLIB_ALIGN(var) var __attribute__((aligned(16))) 
# elif defined WIN32 
#  define VMMLIB_ALIGN(var) __declspec (align (16)) var 
# else 
#  error "Alignment macro undefined" 
# endif 
# endif 
#endif 

這提供了不同的設置,取決於它建立的系統。

無論如何,謝謝。無法相信我對會員訪問感到困惑!

+1

myVecetor如何聲明?假設它是你的類模板的一個實例,你顯示的語句是合法的,但不是特別有用,當然不是對任何東西的「調用」。 – 2010-09-15 13:29:46

+0

哇......我猜Objective-C真的讓我頭腦中毒了。我沒有認出伊娃的存取......謝謝你們。 – 2010-09-15 13:50:13

+0

我因爲愚蠢而被壓低了!?哇謝謝。就好像'#define'和'templates'是所有編程語言的基礎。 – 2010-09-16 13:40:37

回答

4

最終,myVector.array引用類中的數組變量,變量不需要函數調用符號()

BTW /全部資本標識符應該只用於預處理器宏(因爲它們在這裏)。在這種情況下,必須使用宏VMMLIB_ALIGN,以便後續「增強」爲變量生成並與變量一起生成的代碼(例如,用靜態,外部,常量,易失性或特定於編譯器的特定前綴)和/或添加一些相關的功能,例如在陣列上工作的get/set/search/clear/serialise函數。通常 - 當你不確定宏在做什麼時,通過運行編譯器和命令行開關,請求預處理器輸出(在GNU g ++中,開關是-E),可以得到更多的信息。那麼您將能夠看到C++編譯器本身處理的實際源代碼。

編輯 - 一些想法重新您的評論,但太長時間我自己的意見,包括......直到提供了另一種訪問符

C++類是私有的(但在實際的公共接口是正常先放,所以程序員還是要記得明確使用private)。結構默認是公共的。因此,數據在最常見的編碼風格中被默認地有效地公開。而且,它不需要功能調用語義來訪問它。 Objective-C在這方面可能會更好......您的評論意味着您對數據成員和函數使用函數調用符號,這是默認隱藏的?有一個共同的記號是非常好的!在C++中,難的情況是,你有這樣的事情......

struct Point 
{ 
    double x, y; 
}; 

... 

// client usage: 
this_point.x += 3 - that_point.y; 

...然後想改變...

struct Point 
{ 
    double angle, distance; 
}; 

...你需要一些非常奇特以及詳細的手動編碼和非常有效的代理對象x和y,以允許舊的客戶端代碼在運行中隨時計算x和y時保持未修改的工作狀態,並根據需要更新角度和距離。統一的表示法非常棒 - 允許在不改變客戶端源代碼的情況下實現變化(儘管客戶端需要重新編譯)。

+0

好的,我只是假設矢量的底層數組將被隱藏或者其他東西。 Buh ... Objective-C正在接近我。 – 2010-09-15 13:48:38

+0

要回答您的其他意見,在Objective-C中,所有成員都是私有的,並且由於默認的引用計數內存管理而使用getter/setter。 '[object setMember:newValue];'或者獲取'int myNum = [object member];'我期待看看C++中哪種語法不需要'()',因爲我沒有訪問過公共會員永遠!另外,模板對我來說很難理解。 – 2010-09-15 18:19:11

1

array不是一種方法,它是M大小的T類型的數組。

3

也許我過於簡單,但如果你看看#define宏,它只是寫入變量到類中。

所以,你必須

class vector 
{ 
... 
    T array[ M ]; 
}; 

擴建後。所以這只是你班上的一個公共變量。

+0

哇。我認爲這將是私人的......但我猜不是。 – 2010-09-15 13:47:02

1

首先,爲了記錄,模板與此無關。宏和你的類是一個模板的事實沒有特別的相互作用。

二,通過宏的名稱,我猜它是爲了確保變量的對齊。

也就是說,獲得一類X的排列實例x,你會使用VMMLIB_ALIGN(X x);

在實踐中,宏觀確實什麼都沒有。它只是插入它的參數,所以上面的結果在代碼X x;,沒有別的。

但是,這可能是宏定義的不同取決於硬件平臺(因爲對齊要求可能因平臺而異),或者隨着時間的推移(在此之前使用像這樣的虛擬佔位符實現,然後將其替換爲「真正的」實現)

但是,它似乎毫無意義,因爲編譯器已經確保所有變量的自然對齊。