Отбрасывание ветки в C++
Отбрасывание ветки - свойство
if constexpr: код в невыбранной
ветке не проверяют и не включают в программу
для данного типа.
Поэтому в одной ветке можно обращаться
к методам, которых нет у другого типа.
Запишем шаблон для целого и строки, где
альтернативная ветка читает size:
#include <iostream>
#include <string>
#include <type_traits>
template<typename T>
void print_len(const T& value) {
if constexpr (std::is_integral_v<T>) {
std::cout << value << "\n";
} else {
std::cout << value.size() << "\n";
}
}
int main() {
print_len(7);
return 0;
}
Для int компилятор отбрасывает ветку
с size, поэтому программа остается
корректной, хотя у целого нет такого метода.
Объявите шаблон void emit(const T& x):
для целого выводите x, иначе -
x.front. Вызовите шаблон только
с int 4.