2016-11-16 20 views
14

standart C++ 03 dilbilgisi Aşırı yükleme için C++ 03 Standart Dilbilgisi:anlama Operatör şöyle bir operatörüdür aşırı için

operatör fonksiyonlu kimliği:
operatöroperatör
operatöroperatör < şablon argüman listesi?>

Birincisi, normalde kullandığımız sıradan operatör aşırı yüklenme sözdizimi, örn.

Myclass operator + (Myclass s) {...} 

Ancak ikinci seçenek ne anlama geliyor? Özellikle, şablon argümanı-listesi? C++ 11'e hızlı bir bakıştan sonra, ikinci formun standarttan kaldırıldığını buldum. Orijinal niyet neydi?

DÜZENLEME: bana çok mantıklı değil, ancak aşağıda yukarıdaki sözdizimi kullanarak bir yoludur VC++ 2010 ile test ettikten sonra:

class K { 
public: 
    int a; 
    template <int B> 
    int operator + (int b) { 
     return a+b+B; 
    } 
}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    K k; 
    k.a=1; 
    int s; 
    s=k.operator+<115>(2); 
    printf("%d\n",s); 
    return 0; 

} 

output:118 
+0

"operatörleri şablonlu" sen? – JavaMan

+0

Sınıfınız için operatörleri aşırı yükleyebilirsiniz. Ve bu aşırı yükler şablon fonksiyonları olabilir. – StoryTeller

+0

@StoryTeller ancak açık uzmanlıklar sınıf kapsamında olamaz. –

cevap

5

operatör fonksiyonunun uzmanlaşmaya imkân tanıyor dilbilgisi kuralı Şablonlar hala C++ 11'de var, sadece farklı bir yerde.

[temp.names]/1 (C++ 03):

bir şablon uzmanlık (14.7) ve bir model-id tarafından ifade edilebilir

:

şablon id:

template-name < template-argument-listopt> 

şablon isim:

identifier 

şablon bağımsız değişken listesi:

template-argument 
template-argument-list , template-argument 

şablon argüman:

assignment-expression 
type-id 
id-expression 

[temp.names]/1 (C++ 11):

Bir şablon uzmanlığı (14.

basit şablon id:

template-name < template-argument-listopt> 

şablon id:

simple-template-id 
operator-function-id < template-argument-listopt> <- HERE 
literal-operator-id < template-argument-listopt> 

şablon isim:

identifer 
7) bir şablon kimliği tarafından sevk edilebilir

template-argument-list:

template-argument ...opt 
template-argument-list , template-argument ...opt 

şablon argüman: operatör fonksiyonlu kimliği, o şablon argümanı liste anlamlı olmaz bağlamlarda anılır gramer kuralı yüzden taşındı çünkü

constant-expression 
type-id 
id-expression 

Bu büyük olasılıkla yapıldı daha makul bir yere kural </conjecture >.

struct foo{ 
    template <typename T> 
    void operator() (T t) { std::cout << t; } 
}; 

template <> 
void foo::operator()<double> (double) { 
    std::cout << "It's a double!"; 
} 

Not Tdouble zamanlar için operator() için uzmanlaşma: Burada


eyleminde bu kuralın bir örnektir. Bu kodu çalıştırırsanız:

foo f; 
f(0); 
f(0.0); 

Sonra 0 ilk çağrı için baskılı ve saniye It's a double! edilecektir.

Live demo

+0

Bu, onu dışarı çıkarmadan daha mantıklı hale getirir, düşünün :) – StoryTeller

+1

Bkz. [Temel sayı 301] (http://www.open-std.org/jtc1/sc22/wg21/docs /cwg_defects.html#301). –

İlgili konular