Merhaba,
Kısaca KT isminde ve tek parametre ile kurulan bir Kendi Türüm (struct)
var. Yapı içindeki işleç yüklemeleri (3. kısım) sorunsuz ama dışında şablonları kullanmakta zorluk çekiyorum çünkü kendi türüm :)
Aldığım hata şu şekilde:
>dmd -O -of"bitOpAllTest" "bitOpAllTest.d" -release -preview=shortenedMethods (/home/pico dizininde)
bitOpAllTest.d(66): Error: none of the overloads of template D main.topla
are callable using argument types !()(KendiTürüm!int, int)
bitOpAllTest.d(49): Candidate is: topla(K)
Derleme hatalı.
- Sorunu anlayabilmek için enum ile CTFE denedim, bu tamam...
- Sonra çalışma zamanı denemek için kendi işlev şablonlarımı oluşturdum ve yasal türler
(long, int, short vb.)
ile çalışabildiğini gördüm - Kendi Türüm'ün kurulduğu türü (örn. KT4, KT2) taşıyabilemek için de açılmış işlev şablonu içine
static if
'lerimi yazdıysam da nafile!
Aşağıdaki kodun (yani 2. kısım) tür çıkarsaması yaparak çalıştırmak istiyorum:
KT4 bir = 1;
topla(bir, 2).writeln(", ", bir); // Beklenen: "3, 3"
Ama derleme hatası verdiği için açık bir şekilde türü bildirmem gerektiğini farkına vardım. Sanırım 2 parametreli (etkilenen a, etkileyen b) olduğu için tür çıkarsaması olmuyor. Kodun tamamı ve çalışan şekilde aşağıdadır:
/* Lütfen `-preview=shortenedMethods` parametresi ile derleyin,
* alıştırın kendinizi... :)
*
* (Son beta ile default olmak üzere!)
*/
//*
auto toplam(T)(ref T a, T b = 1) => a += b;
auto çarpım(T)(ref T a, T b = 1) => a *= b;
/*/
enum toplam = (int a, int b = 1) => a += b;
enum çarpım = (int a, int b = 1) => a *= b;
//*/
import std.stdio;
void main()
{
// 1. KISIM TAMAM...
auto Int = int.max;
Int.toplam;
assert(Int == int.min);
assert(is(typeof(Int) == int));
auto Short = short.max;
Short.toplam;
assert(Short == short.min);
assert(is(typeof(Short) == short));
auto s = short.max / 2;
s.writeln; // 16383
s.çarpım(2).writeln; // 32766
// 2. SORUNLU KODLAR:
struct KendiTürüm(T) {
T n; alias n this;
this(T n) { this.n = n; }
ref T opOpAssign(string işleç)(T n)
if(işleç == "+") => this.n += n;
ref T opOpAssign(string işleç)(T n)
if(işleç == "-") => this.n -= n;
}
alias KT4 = KendiTürüm!int;
alias KT2 = KendiTürüm!short;
template topla(T)
{
static if(is(T == int))
{
alias T = KT4;
} else {
static if(is(T == short))
{
alias T = KT2;
}
}
enum topla = (ref T a, int b = 1) => a += b;
}
KT4 bir = 1;
//topla(bir, 2).writeln(", ", bir); /* derlenmiyor!
topla!int(bir, 2).writeln(", ", bir); //*/
// 3.'Ü DE TAMAM, aksi olamazdı :)
bir += 1;
bir.write(", ");
bir -= 1;
bir.writeln;
} /*
2. KISMIN ÇIKTISI: 3, 3
3. KISMIN ÇIKTISI: 4, 3
*/
Özetle, tüm varyasyonları ile 1 ve 3. kısımlar tamam ama 2. kısımda patladım. Bu konuda bir çözüm önerisi olan var mı?
Teşekkürler...