2011-07-04 45 views
5

Bir tür alan ve bir (ilgili) türü döndüren bir işlev yazmak mümkün mü? Örneğin, "RandomVariable" adlı bir tür alan ve "RandomVariableCovariance" adlı bir tür döndüren bir işlev. Genelde soru, typenames'in parametreler veya dönüş türleri olup olmadığıdır. C++ 0x iyidir.Bir tür alan ve bir tür döndüren bir işlev yazabilir

+3

Çözmek istediğiniz şeyi söyle, belki de iyi bir tasarım fikri bulabiliriz. –

+0

Netleştirmeniz gerekenler: * * tipini * işleyen bir fonksiyon istersiniz (yani * type * 'RandomVariable' parametresini alır ve 'RandomVariableCovariance' türünü döndürür) veya türünden dönüş türünü belirleyen bir çeşit şablon işlevi ister misiniz? argümanlarından biri? –

+0

Rastgele bir değişken için, ortalama, gerçekleştirmeleriyle aynı türden (bu nedenle, bir şablon parametresi olarak temel türüne sahip bir sınıf içinde bir arabirim yazmak kolaydır) ancak onun kovaryansı farklı bir türdür (önemsiz bir şekilde). Rastgele değişken bir N elemanı vektörü ise (bir ublas vektörü tipi), o rasgele değişkenin kovaryansı bir Nx N eleman matrisi olacaktır (bir ublas matris tipi). Sınıfın açık bir şekilde kovaryansının türünü belirtmesi gerekmediğini, ancak bunun gerçekleştirilmesinden çıkarabileceğini belirtmek isterim. Yararlıysa örnek kod gönderebilirim. – bpw1621

cevap

11

Sen fonksiyonları ile bunu yapamaz, ancak şablon uzmanlık ile yapabilirsiniz. Örneğin

template <class T> 
struct ConvertType; 

template <> 
struct ConvertType<RandomVariable> 
{ 
    typedef RandomVariableCovariance type; 
}; 

int main() 
{ 
    ConvertType<RandomVariable>::type myVar; 
} 

RandomVariable den RandomVariableCovariance dönüştürmek için uzmanlaşmış bir tür ConvertType tanımlar. Bu şekilde ihtiyacınız olan her şeye bağlı olarak her çeşit zeki tip seçimi yapmak mümkündür.

+0

Cevabınızı tamamen gözden kaçırdım ...: P + 1. – Xeo

2

Typenames, bir işlev için parametre veya dönüş değeri olamaz; türleri derleme zamanı bir şeydir!

+0

Bu, C++ 0x'dur, orada olabilir –

+0

@Nicol: C++ 0x, bildiğim şeylerin ötesindedir! Eğer bunu açıklayan bir cevap yazarsanız, o zaman benim ... –

+0

@Nicol: Cevabınız, çalışma zamanında türlerin (veya yazım adlarının) işlenmesini değil, OP'nin sorusunun ne anlama geldiğini ... –

-2

Pardon benim korkunç C, aslında onunla çalışmış beri sonsuza dönemden beri:

typedef int RandomVariable; 
typedef float RandomVariableCovariance; 

RandomVariableCovariance myFunc(RandomVariable x) { 
    .... 
} 
+0

Sanırım bu noktayı kaçırıyor; OP'nin sorusu hakkındaki yorumumu bir tür döndürme isteğidir; Örneğin, çalışma zamanında türleri manipüle! –

+0

oh. temelde c "değişken değişken" gibi bir şey yapmak? korkutucu ... çok çok korkutucu. –

+0

OP'nin sorusunu böyle okudum. Eğer değilse, o zaman çok açık değil! –

0

Bu, C++ 0x için yapılan şeylerin uzun listesindedir. onlar bu garip fonksiyon tanımlama biçimi yarattı nedeni de bu:

auto FuncName(Type1 param1, Type2 param2) -> decltype(param1 + param2) {...} 

Bu dönüş türü aldığınız ne olacağı anlamına gelir:

auto FuncName(Type1 param1, Type2 param2) -> ReturnType {...} 

It, decltype ile birlikte böyle şeyler yapmak için izin verir operatör + (Type1, Type2) diyorsunuz.

C++ 'nin, statik olarak yazılan bir dil olduğunu unutmayın. Çalışma zamanında tür hesaplamaları yapamazsınız. Derleme zamanında, bunun gibi mekanizmalarla veya bir çeşit şablon metaprogramlamayla yapılmalıdır.

+0

Bu hala bir ** derleme zamanı ** kod oluşturma özelliği, bu yüzden gerçekten "bir argüman olarak bir tür almak" değil. –

+2

Sadece derleme zamanında tür hesaplamaları yapabilirsiniz. Tüm şablon metaprogramlama ve tip tabanlı hesaplama, derleyici tarafından yapılır. C++, _statically_ yazılan bir dildir; çalışma zamanı yazımı mümkün değildir. –

+1

Evet, elbette, OP'nin bunun farkında olduğundan emin olmak istedim. Şerefe. –