2014-12-21 39 views
8

Derleyici tarafından bilinen değerleri ayırt etmek ve böylece derleme zamanında hataları algılamak için 'constexpr' parametrelerine sahip olmak yararlı olacaktır. Örnekler:Neden 'constexpr' parametrelerine izin verilmiyor?

int do_something(constexpr int x) 
{ 
    static_assert(x > 0, "x must be > 0"); 
    return x + 5; 
} 

int do_something(int x) 
{ 
    if(x > 0) { cout << "x must be > 0" << endl; exit(-1); } 
    return x + 5; 
} 

int var; 

do_something(9); //instance 'do_something(constexpr int x)' and check arg validity at compile-time 

do_something(0); //produces compiler-error 

do_something(var); //instance 'do_something(int x)' 

Şimdi için geçersiz bir koddur. Birisi bana bunun neden uygulanamayacağını açıklayabilir mi? Bu teoride harika görünse de öyle değil,

template<int x> 
int do_something() 
{ 
    static_assert(x > 0, "x must be > 0"); 
    return x + 5; 
} 

int do_something(int x) 
{ 
    if(x > 0) { cout << "x must be > 0" << endl; exit(-1); } 
    return x + 5; 
} 

int var; 

do_something(9); //instance 'do_something(int x)' and doesn't checks validity at compile-time 

do_something(0); //same as above, if check was performed - compiler error should occur 

do_something<9>(); //instance template 'do_something<int>()' 

do_something<0>(); //produces compiler error 

do_something(var); //instance 'do_something(int x)' 
+1

Bunu bir şablonla zaten yapıyor musunuz? Daha spesifik olmayan tip şablon parametreleri ile? – Borgleader

+0

Ardından, işlevimin kullanıcısı, parametre derleme zamanı bilinmesine bağlı olarak onu çağırmak için farklı bir sözdizimi sağlamalıdır. – AnArrayOfFunctions

+0

bir assert(), bir constexpr değerinin girildiği durumda en iyi duruma getirilmiş olabilir. –

cevap

-4

:

DÜZENLEME: değişmezleri daima hangi işlevi olanlar kadar şablon argümanları olarak geçirilen değildir ve gerekli önlemleri almakla yükümlüdür şablonları kullanıcıları kullanma

çok rahatsız olduğunu gerçek dünyada faydalıdır. İşlevlerin çoğu argümanı derleme zamanı sabitleri değildir ve birçok kısıtlama da derleme zamanında tam olarak bilinmemektedir.

Bu tür aşırı yüklemeyi belirlemek ve uygulamak için önemli miktarda çalışma yapılacak ve bu kadar fazla kullanılmayacaktır. Gerçekten zaman sınırlarını ve argümanlarını derlediyseniz, genellikle tüm fonksiyonu derleme zamanında değerlendirebilirsiniz, bu da aşırı yüklenmenin gerekli olmadığı anlamına gelir.

+1

Bu özellikle NEDEN'e cevap vermiyor, soruyu sorar. – cybermonkey

+0

@cybermonkey Açıkça katılmıyorum. Özelliğin neden standartlara uygun olmadığını açıklamaya çalıştım, neden çabaları haklı çıkaracak kadar yararlı olmadığını açıklamak.Bu soruna diğer cevaplardan farklı olarak, neden herhangi bir şekilde, şekil veya biçim olarak cevap vermez, ancak sadece bir geçici çözümü açıklamaya çalışır (yani, ikinci paragrafımda yazdıklarımı gösteren gerçek kodu koyar). –

2

Doğru yapmaya çalıştığınız şeyi anlıyorsam, isteğiniz işlev zaten mevcut. Bu en zarif değil, ama bence bu yeterince iyi.

Aynı sözdizimi ile derleme zamanı ve çalışma zamanında bir işlevi çağırmak ve eğer mümkünse derleme zamanında değerlendirmek isterseniz, aksi takdirde çalışma zamanında değerlendirmelidir. Ne zaman çağrıldığına bakılmaksızın işlev üzerinde değerlendirilecek iddialara ihtiyacınız vardır.

Bunun ne istediğini yapacak inanıyoruz: Burada

constexpr int do_something(int x) 
{ 
    if(x <= 0) 
    { 
     std::cout << "x must be > 0" << std::endl; exit(-1); 
    } 
    return x + 5; 
} 

constexpr int compiletime_good = do_something(5); 
constexpr int compiletime_bad = do_something(0); // Fails at compile-time 

int runtime_good = do_something(5); 
int runtime_bad = do_something(0); // Fails at runtime 

constexpr int val_good = 5; 
constexpr int val_bad = 0; 

do_something(val_good); 
do_something(val_bad); // Fails at run-time 

int valrun_good = 5; 
int valrun_bad = 0; 

do_something(valrun_good); 
do_something(valrun_bad); // Fails at run-time 

hüner static_assert gerektirmeyen bir şekilde derleme zamanında başarısız olduğunu ve aynı zamanda çalışma zamanında başarısız olur.

+1

Her bir "do_something" örneğinin çağrılmasını gerektirir; burada 'constexpr' beklenen şablonlardan daha iyi değildir. – AnArrayOfFunctions

+0

@FISOCPP Yeterince adil. Constexpr parametrelerini sorma biçimine dahil etmenin açık bir yolunun olmamasının sebebi, hiç kimsenin yazma sorununa gitmesi ve teklif edilen bir teklif almamasıdır. Bunun olduğunu görmek isterdim, ama çok iş gibi görünüyor. –

+1

Elbette kodlama boyunca std :: exit() 'çağrılarını serpiştirmek yerine, bir onaylama hatası bildirmek için mevcut bir tesisi kullanmalısınız. Aksi halde bu çok iyi. –

İlgili konular