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

Как выбрать функцию-член на основе параметра шаблона, используя `enable_if`?

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

How to Select a Member Function Based on a Template Parameter Using `enable_if`?

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

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

#include 
#include 

template
struct Point
{
  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'».

SFINAE в действии

Ключ к пониманию этой проблемы лежит в концепции «Неудачная замена не является ошибкой» (SFINAE). 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 

Предотвращение явной специализации функций-членов

Как отмечает HostileFork, исходный код позволяет явно указывать аргументы шаблона для функций-членов, что может привести к неправильные результаты. Чтобы предотвратить это, мы можем добавить static_assert, который проверяет, предоставлены ли какие-либо аргументы шаблона. Это гарантирует, что на основе аргумента шаблона T всегда вызывается правильная функция-член. Модифицированный код будет таким:

template
struct Point
{
  template
  typename std::enable_if<:is_same int>::value>::type
    MyFunction()
  {
    static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
    std::cout 
  typename std::enable_if<:is_same float>::value>::type
    MyFunction()
  {
    static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
    std::cout 
Последний учебник Более>

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

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

Copyright© 2022 湘ICP备2022001581号-3