2012-05-03 21 views
6

Son zamanlarda ortaya çıktığım bir sorunum var. Bunun olmasını istediğim gibi çözemediğimi düşünüyorum ama yapabilseydim oldukça kullanışlı olurdu. Her neyse, işte sorun:Şablon uzmanlığı adı

Size birkaç gün önce bu forumda gördüğüm bir örnek vereceğim, çünkü bununla açıklanması daha kolay olacaktır. ı bir tensör yapı oluşturmak için çalışıyorum diyelim, bu şekilde:

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

sonsuz yinelemeye önlemek için, I = 1.

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

Aslında zaman N için şablon ihtisas yazmak zorunda kalacak N = 1, bu Tensör aslında bir Vector (fiziksel olan). en Zaten bir vektör yapı bu şekilde tanımladıktan diyelim:

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

Bu yapı tam olarak Tensörünün < 1 gibidir>. Vektör yapısı zaten var olduğundan ve diyelim ki kendimi uygulamamış olsaydım, Tensor < 1> yapısını Vector yapısının bir takma adını yapabilmeyi isterdim. Tıpkı bir yazarı gibi. Yani, bu şekilde yapmak istiyorum:

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

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

Bu şekilde, tensör < 1> ve Vektör tam aynı yapı olacağını, bu yüzden ben istediğiniz yere programda yerine başka bir birini kullanabilirsiniz ediyorum ve aynı yapıyı iki kere yazmam gerekmeyecek. Bununla birlikte, bu şekilde şablon uzmanlığı tanımlamak aslında imkansızdır. Öyleyse, oradaki soruyu sormam.

Not

:

using Vector = Tensor<1>; 

Ama iki farklı yapılar arasında uzmanlık ile yapmak isterseniz oldukça rahatsız olduğunu: önceki örnekte biz hala yapabiliriz çünkü iyi bir olmadığını biliyorum.

using Circle<2> = Hypersphere<2>; 

Yani, özetlemek için: başka bir başka adı olarak tanımlayarak, şablon uzmanlık oluşturmak için bir yolu yoktur, örneğin, N-boyutlu uzayda geometrisini hesaplayabilirdi bir geometri kütüphanesi yazarken? Bir is-bir ilişki modelleme çünkü bu miras kötüye olmadığını

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

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

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

Not:

cevap

8

Verilen eski sınıfları Skaler, Vektör ve Matris, devralmasını kullanabilirsiniz.

+0

Evet, bunu zaten düşündüm, ama eğer öyle yaparsam, sınıflar "tam olarak aynı" olmaz. Demek istediğim değişkenleri bir türden diğerine geçirmek için kullanmalıyım ve down_cast yapmak zorundayım:/ Sadece bir ayrıntı olduğunu biliyorum ve belki de bu sınıfları benim yaptığım şekilde düşünmek için güvenli bir tip olarak düşünülmemiştir, ama tam olarak detay Üstesinden gelmek isterim. Teşekkürler :) – Morwenn

+0

@Morwenn Daha fazla genellik için, örneğiniz iki şablon parametresine ihtiyaç duyacaktır: 'template class Tensor . Burada, D mekansal boyutların sayısı olacaktır. – TemplateRex

+0

Evet, ancak bu örneği sadece sözdizimsel bir problem ortaya çıkarmak için kullandım. Tensörleri kendim veya başka bir şey kullanmıyorum.Sadece benim C++ olasılıklar hakkında fikrimi temizlemek için oldu ^^ " – Morwenn

İlgili konular