Jak można napisać template, tak żeby przyjmował np. tylko fundamentalne typy liczb całkowitych?

0

template <typename T>

W powyższym przykładzie pod T można podstawić (prawie) cokolwiek. Czy i jak można to zawęzić tak, żeby T mogło być np. tylko którymś z fundamentalnych typów liczb całkowitych, dla których poprawnie zdefiniowane jest std::numeric_limits?

0
template<class T, class = std::enable_if<std::is_integral<T>::value>::type>
void foo(T a) {

}
0

Skorzystaj ze static_assert.

@Edit
albo tak jak up.

0

Q: Jak stwierdzić, że próbuje się zrobić coś ponad swój obecny stan umiejętności?
A: Zapytać, jak to zrobić na forum, i uzyskać kod, którego nie dość, że się nie rozumie, to jeszcze nawet nie wie, jak szukać wyjaśnienia w dokumentacji

;P

Ale poważnie, mógłbym prosić o jakieś nakierowanie, jak to zrozumieć?

0

http://en.cppreference.com/w/cpp/types/enable_if
http://en.cppreference.com/w/cpp/language/sfinae

w dużym uproszczeniu:
is_integral<T>::value wynosi true/false w zależności od podanego typu T. jeśli przekażemy true do szablonu enable_if, to ten będzie posiadał typedef o nazwie type, a jeśli false, to nie będzie go posiadał, więc co się stanie gdy nie będzie go posiadał, a mimo to odwołamy się do niego? błąd, czyli nie będziemy mogli użyć funkcji.

0

Dzięki.

Ale, czy nie lepiej zamiast is_integral użyć numeric_limits::is_integer?

Bo z tego co wyczytałem z dokumentacji to teoretycznie może zajść taka sytuacja, że is_integral zwróci true, ale numeric_limits::min() czy numeric_limits::max() nadal będzie niezdefiniowane?

1
template <typename T, typename = typename std::enable_if<std::numeric_limits<T>::is_specialized>::type>
void do_sth_when_value_type_has_numeric_limits_specialization(T) {
}

albo

template <typename T>
void do_sth_when_value_type_has_numeric_limits_specialization(T) {
     static_assert(std::numeric_limits<T>::is_specialized, "numeric_limits is not specialized for given type");
}
0

is_specialized pójdzie dla floatów, a mnie chodzi o integery. Czy jeśli tak, to można użyć is_integer?

1 użytkowników online, w tym zalogowanych: 0, gości: 1