Forum: D Programlama Dili RSS
Bir D güzelliği interfacelerde şablon kullanımı, peki bu C++ da niye olmuyor
kerdemdemir #1
Üye Eyl 2013 tarihinden beri · 123 mesaj · Konum: Danimarka
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Bir D güzelliği interfacelerde şablon kullanımı, peki bu C++ da niye olmuyor
Interface sınıfımı şablonlar ile birleştirebildim(bir önceki başlıkta daha detaylı görülebilir) ve bu çok hoşuma gitti:

interface Node( NodeType)
{
    NodeType.Type GetValue();
    NodeType[] GetConnectedElems();
    void AddConnection( NodeType[] connections... );
}

C++ da ise şablonları ve saf fonksiyonları aynı anda kullanamıyoruz.

 struct A
 {
     template< typename T >
     virtual T foo() = 0;
 };

error: templates may not be 'virtual' virtual T foo() = 0;

D bu işin içinden nasıl çıkıyor. Sanırsam bir tek interface'lere özel bir durum fakat derleme zamanında olması gereken şablonlarla çalışma zamanında olması gereken polymorfism nasıl beraber çalışabiliyor. Peki bu mümkünse C++ 'da niye mümkün değil?
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4538 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Aslında D ve C++ bu konuda aynılar çünkü örneğin Node!int ve Node!float aslında farklı türler. Aynısını C++ ile de yapabiliriz:
#include <iostream>
 
template <class NodeType> class B {
public:
    typename NodeType::Type GetValue();
};
 
struct MyNodeType {
    typedef int Type;
};
 
class D : public B<MyNodeType> {
public:
    int GetValue() {
        return 42;
    }
};
 
int main() {
    D d;
    d.GetValue();
}
Ali
kerdemdemir #3
Üye Eyl 2013 tarihinden beri · 123 mesaj · Konum: Danimarka
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ali Abi ben C++ da şunun derlendiğini bilmiyordum çok teşekkür ederim.

#include <string>
#include <iterator>
#include <iostream>
#include <algorithm>
 
template < typename NodeType > 
struct B
{
    virtual  typename NodeType::Type GetValue() = 0;
};
 
struct MyNodeType {
    typedef int Type;
};
 
class D : public B<MyNodeType> {
public:
    virtual int GetValue() {
        return 42;
    }
};
 
 
int main()
{
    D d;
    std::cout << d.GetValue();
 
}


Virtual anahtar kelimesinin geçtiği yerlerde şablonları kullanabileceğimizi yeni görüyorum. Bu sadece sınıf şablonlarına tanımlanmış bir ayrıcalık mı? Konuyu çok az açma şansın olurmu acaba.
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4538 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
İki dilin de sağlayamadığı şey, şablon üye işlevlerinin virtual olması. Buradaki örneklerde şablon var ama çok şekillikte kullanılmıyorlar. Dikkat edersen, üst sınıf olarak şablon değil, hep bir şablon gerçekleştirmesi (template instance) kullanılıyor. Örneğin, D'nin üst sınıfı B<MyNodeType> denen tür ve bu tür bir şablon değil (ama şablondan gerçekleştirilmiş).

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-12-16, 10:53:02 (UTC -08:00)