Выбор функции-члена с различными условиями Enable_if
В C Enable_if — это инструмент, используемый для условного включения или отключения определенного кода в зависимости от того, аргумент шаблона соответствует определенным критериям. Это может быть полезно, если вы хотите настроить поведение класса или функции на основе параметров его шаблона.
В данном примере цель состоит в том, чтобы создать функцию-член MyFunction, которая ведет себя по-разному в зависимости от того, является ли шаблон параметр T является целым числом или нет. Предполагаемая реализация состоит в использовании двух перегрузок MyFunction: одной для T = int и одной для T != int.
Один из подходов для достижения этой цели — через Enable_if, как показано в коде ниже:
template
struct Point {
void MyFunction(
typename std::enable_if<:is_same int>::value, T >::type* = 0) {
std::cout ::value, float >::type* = 0) {
std::cout Однако этот код приведет к ошибкам компиляции из-за неправильного использования Enable_if. В C замена аргументов шаблона происходит во время разрешения перегрузки. В этом случае подстановки не происходит, поскольку тип T известен во время создания экземпляра функции-члена.
Чтобы решить эту проблему, можно ввести фиктивный параметр шаблона, которому по умолчанию будет присвоено значение T, что позволяет использовать SFINAE. (Ошибка замены не является ошибкой) для правильной работы:
template
struct Point {
template
typename std::enable_if<:is_same int>::value>::type MyFunction() {
std::cout
typename std::enable_if<:is_same float>::value>::type MyFunction() {
std::cout Этот подход гарантирует, что правильная версия MyFunction будет выбрана на основе значения T.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3