перебрать функцию шаблона Variadic и выбрать аргументы указателя

У меня есть функция шаблона Variadic на С++, и я хочу перебрать аргументы шаблона и выбрать те аргументы, которые являются указателями.

ПОЖАЛУЙСТА, СМОТРИТЕ РАЗДЕЛ ОБНОВЛЕНИЙ НИЖЕ.

Итак, у меня есть следующий код ниже. Я написал скелетный код, который можно компилировать и запускать.

      g++ -std=c++17 f3_stackoverflow.cpp && ./a.out

Мне просто любопытна часть, которая говорит: ЗДЕСЬ ПРИХОДИТ ЛОГИКА

      #include <iostream>
#include <vector>
#include <utility>

template <typename... Args>
std::vector<std::pair<int, void*>> check(Args... args) {
    std::vector<std::pair<int, void*>> ret;

    // LOGIC GOES HERE

    return ret;
}

void printVector(std::vector<std::pair<int, void*>> v) {
    for(const auto& _v : v) {
        std::cout << _v.first << " : " << _v.second << std::endl;
    }
}

int main(int argc, char const *argv[])
{
    int n = 100;

    int                 a;
    std::vector<int>    b(n);

    float               c;
    std::vector<float>  d(n);

    char                e;
    std::vector<char>   f(n);

    auto pairs = check(a, b.data(), c, d.data(), e, f.data());
    printVector(pairs);
    
    return 0;
}

Итак, я хочу увидеть следующий вывод вstdoutпрограммы:

      1 : 0x123
3 : 0x567
5 : 0x980

ОБНОВЛЯТЬ:

По сути, я ищу индексы, где аргумент является указателем (например,int*,float*, ...) и адрес, на который указывает указатель. Вот почему вы видите вывод, который я предоставил.

Объяснение вывода: второй, четвертый и шестой аргументы являются указателями (отсюда 1, 3, 5 в индексации с отсчетом от нуля).

1 ответ

Нет необходимости использовать рекурсию. В С++17 вы можете просто комбинировать fold-expression и немедленно вызываемую лямбду, чтобы сделать это

      template <typename... Args>
std::vector<std::pair<int, void*>> check(Args... args) {
  std::vector<std::pair<int, void*>> ret;
  int i = 0;
  ([&](auto arg) {
    if constexpr (std::is_pointer_v<decltype(arg)>)
      ret.emplace_back(i, arg);
    i++;
  }(args), ...);
  return ret;
}

Демо

Другие вопросы по тегам