Nano Hash - криптовалюты, майнинг, программирование

Рекурсивные шаблоны Variadic C++ с расширениями Базовый случай

я хочу использовать рекурсивные вариативные шаблоны с базовым случаем с более чем двумя типами. Следующий пример не компилируется. В чем может быть проблема?

Я ожидал, что f‹int, int›(5) вызовет такой случай:

[с T = int; Арг = целое; Аргументы = {число}]

но это, похоже, не вариант для компилятора (g++ c++17);)

template<class T, typename Arg, typename... Args>
void f(T a) {
}

template<class T, typename Arg>
void f (T a) {
}


int main() {
    f<int, int>(5);
    return 0;
}
<source>: In function 'int main()':

<source>:11:18: error: call of overloaded 'f<int, int>(int)' is ambiguous

   11 |     f<int, int>(5);

      |                  ^

<source>:2:6: note: candidate: 'void f(T) [with T = int; Arg = int; Args = {}]'

    2 | void f(T a) {

      |      ^

<source>:6:6: note: candidate: 'void f(T) [with T = int; Arg = int]'

    6 | void f (T a) {

      |      ^

Compiler returned: 1
03.11.2020

  • Почему вы ожидаете именно этого [with T = int; Arg = int; Args = {int}]? Вы указали 2 параметра int для f. Вы ожидаете, что Args будет выведено из 5? 03.11.2020
  • Да, я думал, что это сработает. Потому что в этом примере это работает (да, я знаю немного по-другому, но я думал, что это будет аналог): template<typename X> int square(X num) { return num * num; } int main() { return square(5); } 03.11.2020
  • Разница в том, что вы не указываете аргументы шаблона, поэтому необходимо выполнить вывод. 03.11.2020

Ответы:


1

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

#include <iostream>

template<class T, typename Arg, typename... Args>
void f(T a) {
    std::cout << sizeof...(Args) << '\n';

    if constexpr (sizeof...(Args) > 0) {
        f<T, Args...>(a);
    }
}

int main() {
    f<int, int>(5);

    std::cout << "---\n";

    f<int, int, double, float, int>(5);
}

Выход:

0
---
3
2
1
0
03.11.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..