Thread overview
Bir D güzelliği interfacelerde şablon kullanımı, peki bu C++ da niye olmuyor
Aug 30, 2017
kerdemdemir
Aug 30, 2017
kerdemdemir
August 30, 2017

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?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 30, 2017

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.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 30, 2017

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 30, 2017

İ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 denen tür ve bu tür bir şablon değil (ama şablondan gerçekleştirilmiş).

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]