2016-09-28 14 views
9

Jak specjalizować funkcję szablonu dla przypadku, w którym wartość jednego z jej argumentów jest znana/nieznana podczas kompilacji (przed faktycznym skompilowaniem i uruchomieniem programu)?Specjalizuje się, jeśli wartość zmiennej jest znana/nieznana w czasie kompilacji

Nie mogę dowiedzieć się, jak jeszcze.

Pomysł 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 

Pomysł 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

dlaczego upadł? "nie da się tego zrobić" jest akceptowalną odpowiedzią. –

+0

Jeśli zrozumiałem poprawnie, wymagałoby to przeciążenia na constexpr. - [Nie można tego zrobić.] (Http://stackoverflow.com/a/33192804/1968) –

+0

@Konrad Rudolph. jeśli poprawnie odczytam tę odpowiedź, oznacza to, że funkcja nie może mieć argumentu "constexpr". Myślę o specjalizacji przez cechę, zamiast redefiniować 'constexpr' .... lub jeśli istnieje jakiś sposób, który działa. –

Odpowiedz

1

Cóż, myślę, że masz na myśli typ argumentu, prawda? Wartości nie mają znaczenia dla częściowych specjalizacji szablonów ...

Następnie: Nie można tego zrobić.

Typy parametrów szablonów muszą być znane podczas kompilacji. W jaki inny sposób kompilator powinien wygenerować poprawny kod?

Również w przypadku specjalizacji częściowych szablonów, typy muszą być znane podczas kompilacji z tego samego powodu.

+0

oraz. ale "parametr jest znany/nieznany w czasie kompilacji" jest znany w czasie kompilacji. Chcę wiedzieć, czy jest to możliwe: Jeśli parametr jest znany (w czasie kompilacji), specjalizuj szablon jako wersję A; w przeciwnym razie specjalizuj szablon jako wersję B. –

+0

Mam problemy z wyobrażeniem sobie scenariusza, w którym typ parametru powinien być nieznany w czasie kompilacji. Podaj przykład kodu źródłowego. – Rene

+0

to nie jest typ. to jest wartość. 'int a;' sam nie określa wartości. 'constexpr int a = 6;' określa wartość, która jest znana w czasie kompilacji. Dla 'int a; bool b = (a == a); ', wartość' b' jest znana w czasie kompilacji. –