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

Как использовать Enable_if для выбора функций-членов на основе аргументов шаблона?

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

How to Use enable_if to Select Member Functions Based on Template Arguments?

Выбор функции-члена с использованием различных условий Enable_if

Метафункция Enable_if используется для указания параметров функции шаблона и выбора подходящих функций-членов на их основе . Рассмотрим следующий код:

template
struct Point
{
  // Check if T is int and call MyFunction for int
  void MyFunction(typename std::enable_if<:is_same int>::value, T &>::type* = 0)
  {
    std::cout ::value, float &>::type* = 0)
  {
    std::cout 

Однако этот код может вызвать ошибки компилятора, указывающие на то, что «нет типа с именем 'type' в 'struct std::enable_if'».

Понимание Enable_if

enable_if гарантирует, что при разрешении перегрузки учитываются только допустимые перегрузки функций. Если замена аргумента шаблона не удалась, эта перегрузка удаляется из набора кандидатов.

В приведенном выше примере аргумент шаблона 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 
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3