2012-05-03 56 views
6

我有我想出了一個新的問題。我實際上認爲它不能按照我希望的那樣得到解決,但如果可能的話,它會非常方便。總之,這裏的問題:模板專業化別名

我會給你我已經看到了前幾天在這個論壇上的例子,因爲它會更容易用它來解釋。比方說,我想創建一個張量結構,這種方式:

template <int N> 
struct Tensor 
{ 
    Tensor<N - 1> x; 
    Tensor<N - 1> y; 
    Tensor<N - 1> z; 
}; 

爲了避免無限遞歸,我會寫模板專門爲N = 1

template<> 
struct Tensor<1> 
{ 
    double x; 
    double y; 
    double z; 
}; 

其實,當N = 1,這個張量實際上是一個矢量(物理的)。比方說,我已經有一個vector結構定義是這樣的:

struct Vector 
{ 
    double x; 
    double y; 
    double z; 
}; 

這個結構酷似張量< 1>。由於Vector結構已經存在,假設我自己沒有實現它,我希望能夠使Tensor結構成爲Vector結構的別名。就像typedef一樣。所以,我想這樣來做:

// C++03 
typedef Vector Tensor<1>; 

// or C++11 
using Tensor<1> = Vector; 

這樣,張量< 1>和Vector將是完全相同的結構,所以它會我可以在程序中使用,而不是另外一個地方我想而且我不需要兩次寫入相同的結構。

但是,它實際上不可能定義模板專業化的方式。如果是這樣,我不會在那裏問這個問題。

注:我知道前面的例子不是一個好一個,因爲我們仍然可以做到這一點:

using Vector = Tensor<1>; 

但是它是相當麻煩,如果我想有兩個不同結構的特做。比如寫一個幾何庫,可以計算幾何在N維空間時:

using Circle<2> = Hypersphere<2>; 

所以,總結一下:有沒有辦法通過它定義爲一個又一個的別名來創建模板特?

回答

8

鑑於傳統類標量,向量和矩陣,你可以使用繼承:

template<> 
class Tensor<0>: public Scalar {}; 

template<> 
class Tensor<1>: public Vector {}; 

template<> 
class Tensor<2>: public Matrix {}; 

請注意,這不是繼承的濫用,因爲你模擬的是-的關係。

+0

是啊,我已經想到這一點,但如果我這樣做,這些類不會是「完全一樣」。我的意思是我會投和down_cast從一種類型的變量傳遞給其他:/ 我知道這只是一個細節,也許是它不被視爲類型安全的考慮這些類我做的方式,但它的確切細節我想克服。 不管怎樣,謝謝:) – Morwenn

+0

@Morwenn更多一般性,您的示例將需要兩個模板參數:'模板<爲size_t N,爲size_t d = 3>類張量。這裏,D是空間維度的數量。 – TemplateRex

+0

是的,但我只是舉個例子來揭露一個語法問題。我不用自己或任何東西的張量。這只是爲了澄清我對C++可能性的看法^^「 – Morwenn