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

Почему SFINAE не работает с функциями-членами шаблонов классов?

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

Why Doesn't SFINAE Work with Member Functions of Class Templates?

Почему SFINAE (enable_if) не работает для функций-членов шаблона класса?

В C SFINAE (ошибка замены не является ошибкой) позволяет вам включить или отключить код в зависимости от типа аргумента шаблона. Однако при работе с функциями-членами шаблона класса SFINAE часто не работает должным образом.

Вот пример, демонстрирующий проблему:

#include 

struct A {};
struct B {};

template 
struct Foo
{
    typename std::enable_if<:is_same a>::value>::type bar()
    {}

    typename std::enable_if<:is_same b>::value>::type bar()
    {}
};

В этом примере Foo определяет две перегруженные функции-члены bar(). Первая перегрузка активируется, когда T равно A, а вторая активируется, когда T равно B. Однако если вы попытаетесь скомпилировать этот код, вы получите сообщение об ошибке, указывающее, что перегрузки не могут быть разрешены.

Причина этой ошибки заключается в том, что SFINAE работает только для выведенных аргументов шаблона. В случае функций-членов шаблона класса аргумент шаблона не выводится, а указывается явно. Чтобы устранить эту проблему, вы можете использовать один из следующих методов:

  • Используйте явные аргументы шаблона:

    struct Foo
    {
      void bar(A) {}
      void bar(B) {}
    };
  • Используйте std::enable_if внутри функций-членов:

    template 
    struct Foo
    {
      template
      typename std::enable_if<:is_same a>::value>::type bar() {}
    
      template
      typename std::enable_if<:is_same b>::value>::type bar() {}
    };
  • Использовать явную специализацию шаблона класса:

    template  struct Foo { void bar() {} };
    template  struct Foo { void bar() {} };
Последний учебник Более>

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

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

Copyright© 2022 湘ICP备2022001581号-3