2009-09-07 25 views
8

C++ sınıf operatörlerini statik bağlamda aşırı yüklemek mümkün mü? Örneğin. Eğer operatör bir sınıf üzerinde çalışır kastediyorsanC++ statik operatör aşırı yükleme

class Class_1{ ... } 
int main() 
{ 

    Class_1[val]... 

} 
+0

Olmalı 'Class_1 [val]' verim bir için, op[] için at gibi plus<a, b> onun şablonları kullanabilir yazın? Class_1 [val] v; 'yi yapmayı mı bekliyorsunuz? –

+1

İntegral değerlere sahip olacaktım ama türleri iyi. – jameszhao00

+0

C++ 'da, türler tip sistemiyle temsil edilemez (sadece 'std :: type_id' var) ve statik olarak aşırı yüklenebilecek herhangi bir operatör düşünemiyorum. Uygulama fikrinizin C++ 'da uygulanabilir olup olmadığını sormak yerine, bunun çözülmesi gereken asıl _problemi' yi sunduğunuzu öneriyorum. Birisi uygulanabilir bir uygulama önerebilir. – sbi

cevap

13

Yerleşik operatörü kullanarak meta programlamayı arıyorsanız: Böyle bir şey mümkün değil - yerleşik işleçler, derleme zamanı değerlerinde değil, çalışma zamanı değerleri üzerinde çalışır.

Bunun için boost::mpl kullanmak ve bunun yerine yerleşik operatörler kullanmak yerine, op+ vb

int main() { 
    using boost::mpl::vector; 
    using boost::mpl::at_c; 
    using boost::mpl::plus; 
    using boost::mpl::int_; 

    typedef vector<int, bool, char, float> Class_1; 
    typedef vector< int_<1>, int_<2> > Numeric_1; 

    at_c<Class_1, 0>::type six = 6; 
    typedef plus<at_c<Numeric_1, 0>::type 
       ,at_c<Numeric_1, 1>::type>::type r; 
    int i3[r::value] = { 4, 5, 6 }; 
    return ((i3[0] + i3[1] + i3[2]) * six) == 90; 
} 
3

, mantıklı değil sayılı, bu int veya double üzerinde operator + may operatörü söylemek gibidir. Operatörler, işlevler için sözdizimsel şekerlerdir ve türler olmayan türler (değerler) üzerinde çalışırlar.

+1

Bir tür yardımcı program sınıfına sahipseniz, yalnızca statik üyelerle - bir şeyi "kendine" yükler, bu da en basit şekilde erişmek istediğiniz işlevsellik anlamına gelir. –

+1

Yep, @ jave.web'nin yorumuna ekleniyor: sınıfın statik kapsamı * içinde veriler olduğunda * durumlarda kesinlikle mantıklı olabilir. (OP aynı zamanda statik kapsamı açıkça belirtir.) Yani, basit aritmetik ile değil, örneğinizde olduğu gibi, ama [],(), <<, >> gibi şeyler de herhangi bir karmaşık yönetici sınıfı için mükemmel sözdizimsel şeker olabilir. , tek bir tek örneği zorlamadan. –

5

Bunun mümkün olduğuna inanmıyorum, ancak bu konuda yanlış olabilirim. Bunu neden yapmak istediğini sormak istiyorum. Örnekler yerine bir sınıftaki işlemleri gerçekleştirmek yerine, belki de uygulamanız boyunca yalnızca bir örnek istersiniz? Bu durumda, muhtemelen the singleton pattern kullanıyor olmalısınız.

+1

Tekil desenini deli gibi kullandım, ancak daha sonra durdu, çünkü tekil kod sınamaları yazmak için bir güçlüktür. – jameszhao00

1

Hayır, operatörler bir sınıfın statik üyeleri olamaz. Bunun yerine düzenli bir statik işlev kullanın.

İlgili konular