[英]iterate over a Variadic Template function and choose pointer arguments
我在 C++ 中有一個可變參數模板函數,我想遍歷模板參數並挑選那些作為指針的參數。
請參閱下面的更新部分。
所以,我在下面有以下代碼。 我寫了一個可編譯和可運行的骨架代碼。
g++ -std=c++17 f3_stackoverflow.cpp && ./a.out
我只是對上面寫着的部分感到好奇: LOGIC GOES HERE
#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)。
template <int N, typename Arg, typename... Args>
void helper(std::vector<std::pair<int, void*>>& v, Arg arg, Args... args) {
if constexpr(std::is_pointer_v<Arg>) {
v.emplace_back(N, (void*)arg);
}
if constexpr(sizeof...(args) > 0) {
helper<N+1, Args...>(v, args...);
}
}
template <typename... Args>
std::vector<std::pair<int, void*>> check(Args... args) {
std::vector<std::pair<int, void*>> ret;
helper<0>(ret, args...);
return ret;
}
也許是使用折疊表達式的更簡單的版本
template <typename Arg>
void helper(std::vector<std::pair<int, void*>>& v, Arg arg, int idx) {
if constexpr(std::is_pointer_v<Arg>) {
v.emplace_back(idx, (void*)arg);
}
}
template <typename... Args>
std::vector<std::pair<int, void*>> check(Args... args) {
std::vector<std::pair<int, void*>> ret;
int n = 0;
(helper(ret, args, n++), ...);
return ret;
}
沒有必要使用遞歸。 在 C++17 中,您可以結合 fold-expression 和立即調用的 lambda 來執行此操作
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.