Arhn - архитектура программирования

Вызов и перегруженная функция шаблона

Предполагая, что у меня есть 2 перегруженных метода в классе, показанном ниже. Пожалуйста, игнорируйте необходимость такой странной перегрузки методов, с которой я недавно столкнулся.

    class A{
      public:

        //Lets call this method 1
        int GetVal(bool isCondition) const
        {
             //do something and return val
        }

        //Lets call this method 2
        template<typename T>
        int GetVal(T expression)
        {
            //do something using expression
            //and return val
        }

    };

int main()
{
    A obj;
    int val = obj.GetVal(false) << std::endl; //I want to invoke method 1
}

В функции main() я хочу вызвать метод1, а не метод2. Как я могу этого добиться? Спасибо за чтение


  • Извините, мне пришлось внести изменение: метод 1 является константным 21.03.2019

Ответы:


1

В функции main() я хочу вызвать метод1, а не метод2. Как я могу этого добиться? Спасибо за чтение

И это именно то, что вы звоните

obj.GetVal(false)

потому что false — это bool, так что это точное совпадение с не-шаблонным методом. И когда вызов совпадает с методом шаблона и методом не шаблона, метод не шаблона (в случае точное совпадение) предпочтительнее.

Настоящая проблема: как вызвать метод2, вызвав его с типом (bool) не шаблонного метода (метод 1)?

Ответ (возможный ответ): добавьте template, вызвав его

obj.template GetVal(false)

Ниже приведен полный рабочий пример

#include <iostream>

struct A
 {
   //Lets call this method 1
   int GetVal (bool)
    { return 1; }

   //Lets call this method 2
   template <typename T>
   int GetVal (T)
    { return 2; }
 };

int main ()
 {
   A obj;

   std::cout << obj.GetVal(false) << std::endl;           // print 1
   std::cout << obj.template GetVal(false) << std::endl;  // print 2
 }

-- ИЗМЕНИТЬ--

Учитывая, что OP точно указывает, что метод 1 - это const (а метод 2 - нет), метод 2 становится более подходящим.

Проблема может быть решена путем изменения A, как в ответе Jarod42 (добавление неконстантного нешаблонного метода, который вызывает константный метод, или SFINAE, отключающего метод шаблона 2, когда T равно bool), или как в ответе Странника (создание const также метода 2) .

Но если вы не хотите (или не можете) изменять класс A, вы можете просто использовать static_assert() непосредственно в main()

std::cout << static_cast<A const &>(obj).GetVal(false) << std::endl;
20.03.2019
  • (см. правки) Спасибо, но это не то поведение, которое я вижу. В моем случае вызывается метод 2 21.03.2019
  • @user3880248 user3880248 - Понятно ... да: если метод 1 - const, он другой: метод шаблона лучше подходит. В этом случае вы можете следовать предложениям Jarod42 (статическое приведение или SFINAE) или также путем Wanderer (сделать const также методом шаблона) или просто вызвать GetVal() в main(), используя static_const: std::cout << static_cast<A const>(obj).GetVal(false) << std::endl; 21.03.2019

  • 2

    Вы можете добавить дополнительную перегрузку:

    class A{
    public:
        // Lets call this method 1
        int GetVal(bool isCondition) const { /* do something and return val */ }
        int GetVal(bool b) { return static_cast<const A&>(*this).GetVal(); }
    
        // Lets call this method 2
        template<typename T>
        int GetVal(T expression) { /* do something using expression and return val */ }}
    };
    

    Или используйте SFINAE для метода2, чтобы отбросить параметр bool:

    class A{
    public:
        // Lets call this method 1
        int GetVal(bool isCondition) const { /* do something and return val */ }
    
        // Lets call this method 2
        template <typename T, std::enable_if_t<!std::is_same<bool, T>::value>, int> = 0>
        int GetVal(T expression) { /* do something using expression and return val */ }}
    };
    
    20.03.2019

    3

    Я знаю только 2 варианта

    1. Использовать все перегрузки как константы

      //Lets call this method 1
      int GetVal(bool isCondition) const
      { /*do something and return val*/ }
      
      //Lets call this method 2
      template<typename T>
      int GetVal(T expression) const
      { /*do something using expression and return val*/ }
      
    2. или как не константа

      //Lets call this method 1
      int GetVal(bool isCondition)
      { /*do something and return val*/ }
      
      //Lets call this method 2
      template<typename T>
      int GetVal(T expression)
      { /*do something using expression and return val*/ }
      

    Затем будет вызван метод 1.

       std::cout << obj.GetVal(false) << std::endl;
    

    Если вам нужен метод 1 const, используйте второй пример Jarod42. это работает

    template <typename T, std::enable_if_t<!std::is_same<bool, T>::value> = 0 >
    int GetVal(T expression)
    { /*do something using expression and return val*/ }
    
    21.03.2019
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..