2016-09-28 34 views
9

Derleme süresinde argümanlarından birinin değerinin bilinmesi/bilinmemesi (şablonun gerçekte derlenmesi ve çalıştırılmasından önce) için şablon işlevinin nasıl özelleştirilmesi gerekir?Bir değişkenin değerinin derleme zamanında bilinmesi/bilinmemesi konusunda uzmanlık edin

Henüz ne olduğunu anlayamıyorum.

Fikir 1:

#include <type_traits> 
#include <iostream> 
int main(void){ 
    int a; //value of a is not known at compile time 
    bool b = (a == a); //value of b is known at compile time. 
    std::is_assignable< constexpr bool, bool >::value 
} 
//g++ magic.cpp -std=c++14 
//error: wrong number of template arguments (1, should be 2) 
// std::is_assignable< constexpr bool, bool >::value 

Fikir 2:

#include <type_traits> 
#include <iostream> 
int main(void){ 
    const int a=1; 
    int b = (a == a); 
    std::cout << __builtin_constant_p (a) << std::endl; 
    std::cout << __builtin_constant_p (b) << std::endl; 
} 
//prints 0 and 0. 
+2

neden downvote? "bu yapılamaz" kabul edilebilir bir cevaptır. –

+0

Seni doğru anladıysam, bu durum constexpr'de aşırı yüklenmeyi gerektirir. - [Yapılamaz.] (Http://stackoverflow.com/a/33192804/1968) –

+0

@Konrad Rudolph. Cevabını doğru okuduğumda, bir fonksiyonun "constexpr" argümanına sahip olamayacağını söyler. "Constexpr" 'ı yeniden tanımlamak yerine, ya da işe yarayan herhangi bir yol varsa, özelleşmeyi özelliğe göre düşünürüm. –

cevap

1

Eh, doğru, sen Tartışmanın tip demek ha? Değerler kısmi şablon uzmanlıkları için önemli değildir ...

Ardından: Bu yapılamaz.

Şablonlar için parametre türleri derleme zamanında bilinmelidir. Derleyici doğru kodu nasıl üretmelidir? Ayrıca, kısmi şablon uzmanlıkları için, türler aynı sebepten derleme zamanında bilinmelidir.

+0

de. ancak derleme zamanında "derleme zamanında bir/bilinir bilinir" bilinir. Aşağıdakilerin mümkün olup olmadığını bilmek istiyorum: Parametre biliniyorsa (derleme zamanında), şablonu sürüm A olarak uzmanlaşın; aksi halde, şablonu B sürümüyle uzmanlaşın. –

+0

Derleme zamanında bir parametrenin türünün bilinmesi gereken bir senaryo hayal etmemde sorun yaşıyorum. Lütfen bir kaynak kodu örneği sağlayın. – Rene

+0

, türü ile ilgili değil. bu değerdir. int a; 'yalnız değeri belirtmez. constexpr int a = 6; 'derleme zamanında bilinen bir değeri belirtir. Int için; bool b = (a == a); ', 'b' değeri derleme zamanında bilinir. –