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

Проверьте тип параметра шаблона и используйте другой шаблон

У меня есть функция шаблона для class C и две другие функции шаблона для typename T, которые я хотел бы использовать, как показано ниже:

template <typename T>
std::string MyHelperFunction1(...) { ... }

template <typename T>
std::string MyHelperFunction2(...) { ... }

template <class C>
std::string MyFunction(...) {
    // if C is an instance of Struct1<T> -> call MyHelperFunction1<Struct1<T>>
    // if C is an instance of Struct2<T> -> call MyHelperFunction2<Struct2<T>>
    
    Database db = OpenDatabase();
    return MyFunction<C>(db, ...);  // The same function but with different input args.
}

Самый близкий вопрос, который я нашел, был следующим (Как проверить тип параметра шаблона?), который не работает в моем случае, потому что я вызываю другие функции шаблона внутри MyFunction(). Какое рабочее решение для того, что я хочу иметь?

15.01.2021

  • Я бы избегал ..., который имеет особое значение (C-многоточие или вариативный шаблон). 15.01.2021
  • Спасибо, Джарод. Хотя в данном случае я не думаю, что это можно прочитать по-другому, я согласен с тем, что это имеет реальное значение и может создать путаницу. Я буду иметь это в виду для своих будущих постов. (причина, по которой я не меняю вопрос сейчас, заключается в том, что ответы следуют одному и тому же стилю. Изменение вопроса может создать больше путаницы, чем их сокращение) 15.01.2021

Ответы:


1

Вы можете попробовать использовать специализацию шаблона, чтобы решить, какую функцию вызывать, например:

template <typename T>
struct helper {
    static std::string MyHelperFunction(...) {
        return "";
    }
};

template <typename T>
struct helper<Struct1<T>> {
    static std::string MyHelperFunction(...) {
        return MyHelperFunction1<Struct1<T>>(...);
    }
};

template <typename T>
struct helper<Struct2<T>> {
    static std::string MyHelperFunction(...) {
        return MyHelperFunction2<Struct2<T>>(...);
    }
};

template <class C>
std::string MyFunction(...) {
    helper<C>::MyHelperFunction(...);
    ...
}
15.01.2021
  • Как сказал @Jarod42. Я сделал UV, а потом понял, что это не компилируется. 15.01.2021
  • @ Jarod42 хорошее замечание. я обновил свой пример 15.01.2021

  • 2

    Идея состоит в том, чтобы написать помощник для вызова правильной функции в соответствии с типом C.

    template <typename T>
    auto MyFunctionHelper(Struct1<T> s, ...) { return MyHelperFunction1(s, ...); }
    
    template <typename T>
    auto MyFunctionHelper(Struct2<T> s, ...) { return MyHelperFunction2(s, ...); }
    
    template <typename C>
    std::string MyFunction(C c, ...){ return MyFunctionHelper<C>(c, ...); }
    
    15.01.2021
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге 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 , и использованием..

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