«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как реализовать перегрузку условных функций-членов с помощью Enable_if в C++?

Как реализовать перегрузку условных функций-членов с помощью Enable_if в C++?

Опубликовано 8 ноября 2024 г.
Просматривать:635

How to Implement Conditional Member Function Overloads Using enable_if in C  ?

Выбор функции-члена с различными условиями 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