2016-12-15 77 views
6

Chciałbym sprawdzić, kiedy jeden z moich lekarzy zostanie wywołany ze znaną wartością kompilacji. Czy istnieje sposób, aby to wykryć?SFINAE: Wykrywanie, czy funkcja jest wywoływana przez znaną wartość czasu kompilacji

Więc kiedy ktoś nazwać:

A a (10); 

od 10 to czas kompilacji znana stała, lubię nazywać specjalną konstruktor, tak:

template<int Value, typename = std::enable_if_t<Value <= 100>> 
A (int Value) {} 

Każdy pomysł w jaki sposób można rozwiązać ten przypadek? Dzięki!

Odpowiedz

4

Integral stały może rozwiązać swój problem:

struct A { 
    template<int v, std::enable_if_t<(v <= 100)>* = nullptr> 
    A(std::integral_constant<int, v>) {} 
}; 

Następnie można go używać tak:

A a{std:integral_constant<int, 7>{}}; 

Dla łatwości obsługi, można również użyć coś podobnego do tego, co boost::hana ma. To określenie dosłownego operatora, że ​​przekształcenia liczby w integralny Constant:

A a{76_c}; // the ""_c operator outputs an std::integral_constant<int, 76> 

można przeczytać więcej na temat tego operatora w boost::hana documentation

+0

Dzięki za pomysł, niestety tak nie jest. Naprawdę ważnym punktem mojej libacji jest to, że musi być tak łatwa w użyciu, jak proste typy pierwotne. Podobnie jak 99% programistów C++ nawet nie wie o integral_constant. – Melkon

+4

To jest naprawdę bardzo dobre rozwiązanie, +1, a reszta 99% programistów C++ powinna się nauczyć o 'integral_constant' :) Zdecydowanie wybrałbym tę trasę, jeśli tego chcesz, po prostu testując wartości niektórych stałych podczas kompilacji czas. – vsoftco

+0

@vsoftco W tym kontekście: Pracuję nad niezmienną biblioteką, która ma zastąpić znaki (lub inne typy kontroli) w oparciu o typy pierwotne i umieścić je w informacji o typie. Celem jest być tak prostym, jak prymitywne typy, ale tworzyć ładniejszy i bardziej wydajny kod. Ta integralna wersja jest miłym dodatkiem, ale moim celem jest optymalizacja rzeczy w milczeniu, bez konieczności myślenia o tym. Pewnie, niektórzy użyją integral_constant, ale większość nie, i szczerze mówiąc, jeśli będą musieli z niego korzystać, kod nie będzie ładniejszy, co chcę osiągnąć. – Melkon