2017-07-31 44 views
18

Özel tür niteleyici (const'a benzer) uygulamak için herhangi bir yolu var mı? Aynı niteliğe sahip işlevler içinde, yalnızca işlevlerin doğru niteliğe sahip işlevlere çağrılmasına izin vermek istiyorum.C++ özel niteleyiciler oluşturmanın bir yolu var mı?

ı olurdu diyelim: Belirli bir iş parçacığı üzerinde denir işlevleri yalnızca gerçek zamanlı güvenli işlevleri çağırmak emin olmak istiyorum, çünkü bunu yapmak istiyorum

void allowedFunction(); 
void disallowedFunction(); 

//Only allowed to call allowed functions. 
void foo() 
{ 
    allowedFunction(); 
    disallowedFunction(); //Cause compile time error 
} 

//Is allowed to call any function it wants. 
void bar() 
{ 
    allowedFunction(); 
    disallowedFunction(); //No error 
} 

nedenidir. Birçok uygulama, gerçek zamanlı güvenli iş parçacıklarını gerektirdiğinden, derleme zamanında kilitleri algılamanın bir yolunun olması, çalışma zamanı hatalarını algılamanın pek mümkün olmadığını garanti eder.

+0

Dile yeni anahtar kelimeler eklemek için, hiç şans yok (Komiteyi ikna edemediğiniz sürece). Makroları kullanabileceksiniz. –

+0

Sanırım buna karışmış olabilirsiniz: [Metaclasses: C++ üretken düşünceler] (https://herbsutter.com/2017/07/26/metaclasses-thoughts-on-generative-c/) –

+0

Belki de Belirli başlık dosyalarında gerçek zamanlı güvenli fonksiyon beyanı? – Oliv

cevap

6

Belki şöyle sınıfının izin olanları arkadaşlar bir sınıfta fonksiyonlarını koyup yapabilirsiniz:

#include <iostream> 

class X 
{ 
    static void f(){} 
    friend void foo(); // f() is only allowed for foo 
}; 

void foo() // allowed 
{ 
    X::f(); 
} 

void bar() // disallowed 
{ 
    //X::f(); // compile-time error 
} 

int main() 
{ 

} 

Muhtemelen istediğiniz her fonksiyon için şeffaf yapar çılgın makro yazabilirsiniz izin vermek/engellemek.

+0

Arkadaşlık işlevleri, izin verilmeyen işlevlerin çağrılmadığını garanti etmez. Bu şekilde, yalnızca belirli işlevlere izin vermeyebiliriz, tüm işlevlere izin vermeyiz ve birkaçına izin verebiliriz. Hiçbir kilitin alınmadığından kesinlikle emin olmalıyım. –

+0

@AndreasLoanjoe Daha iyi kontrol için, sanırım her sınıf için bir fonksiyona ihtiyacın var. Güzel soru olsa! – vsoftco

İlgili konular