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
cevap
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.
Cevabınızı tamamen gözden kaçırdım ...: P + 1. – Xeo
Typenames, bir işlev için parametre veya dönüş değeri olamaz; türleri derleme zamanı bir şeydir!
Bu, C++ 0x'dur, orada olabilir –
@Nicol: C++ 0x, bildiğim şeylerin ötesindedir! Eğer bunu açıklayan bir cevap yazarsanız, o zaman benim ... –
@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 ... –
Pardon benim korkunç C, aslında onunla çalışmış beri sonsuza dönemden beri:
typedef int RandomVariable;
typedef float RandomVariableCovariance;
RandomVariableCovariance myFunc(RandomVariable x) {
....
}
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! –
oh. temelde c "değişken değişken" gibi bir şey yapmak? korkutucu ... çok çok korkutucu. –
OP'nin sorusunu böyle okudum. Eğer değilse, o zaman çok açık değil! –
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.
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. –
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. –
Evet, elbette, OP'nin bunun farkında olduğundan emin olmak istedim. Şerefe. –
- 1. Bir işlev döndüren bir işlev türü yazabilir miyim?
- 2. 400 Hatalı İstek: bilinmeyen bir alan 'tür'
- 3. Bir tür tanımında iç içe tür parametreleri
- 4. Kullanıcı tanımlı bir tür
- 5. Bir veri yapısını alan ve içindeki tüm satırları döndüren genel bir işlev var mı?
- 6. Niçin anonim tür kullanıyor ve GroupBy'de açık bir tür kullanmıyorsunuz?
- 7. iOS 8 Bir tür
- 8. bir tür hatasının
- 9. MapActivity, bir tür için
- 10. Çalışma zamanında belirlenen bir tür parametresiyle genel bir işlev çağrısı
- 11. tür açıklamaları bir yineleyici
- 12. Haskell Bir Tür Değişkeni Referansı
- 13. Geçerli tür bir arabirimdir ve yapılamaz. Bir tür eşlemesi eksik misiniz?
- 14. Bu ne tür bir kod?
- 15. Ne tür bir istisna EEMessageException?
- 16. Sadece bir tür alınabilir. ABC,
- 17. Haskell işlevi bir tür ve bir değer alır ve değerin
- 18. Common Lisp'de bir tür silme
- 19. Tür
- 20. Başka bir işlev döndüren bir işlev için dönüş türü nedir?
- 21. Bir işlev döndüren bir işlev döndürme işlevi, vb
- 22. Bu tür bir php işlevi nasıl tanımlanır?
- 23. Genel bir hızlı işlevde tür dökümleme
- 24. Herhangi bir tür kalibrelenebilir uçbirimi seçmemiz gerekiyor.
- 25. C# genel bir tür alanlarını almak nasıl
- 26. gettype ve bilinmeyen tür php
- 27. Tür Üyeler ve Kovaryans
- 28. tür uyuşmazlığı
- 29. Ne tür * args ** işlev önbellek için kwargs?
- 30. Alan adını bir işlev şablonuna aktarma
Çözmek istediğiniz şeyi söyle, belki de iyi bir tasarım fikri bulabiliriz. –
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? –
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