перебрать функцию шаблона 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;
}