gpt4 book ai didi

c++ - 遍历具有 int 类型的模板化 C++ 函数

转载 作者:行者123 更新时间:2023-12-04 00:51:00 25 4
gpt4 key购买 nike

是否有这样的解决方案来循环使用模板化 int 参数的函数,而无需在任何时候使用 body() 函数创建新结构 forIdx 需要新功能吗? C++20 中的模板化 lambda 似乎很有前途,但似乎无法指定不会自动推导的模板参数。

struct LoopFunc {
template <int i>
void body() {
std::cout << i;
};
};

template<int i>
struct forIdx {
template<typename T>
static void loop(T&& func) {
func.body<i>();
forIdx<i - 1>::loop(func);
}
};

template<>
struct forIdx<-1> {
template<typename T>
static void loop(T&& func) {};
};

int main() {
forIdx<10>::template loop(LoopFunc{});
}

该函数用于创建元组元素的笛卡尔积。 DirectProduct 包含的元素都具有静态 generateAllElements() 函数。

    struct CrossProduct {
std::tuple<MockElement...> vals;
std::set<DirectProduct> result;
template <int num>
void body() {
if (result.empty()) {
for (const auto& e2 : std::get<num>(vals).generateAllElements()) {
DirectProduct tmp;
std::get<num>(tmp.vals) = e2;
result.insert(tmp);
}
}
else for (const DirectProduct& e1 : result)
for (const auto& e2 : std::get<num>(vals).generateAllElements()) {
DirectProduct tmp = e1;
std::get<num>(tmp.vals) = e2;
result.insert(tmp);
}
};
};

DirectProduct 在它自己的 generateAllElements() 函数中使用了 CrossProduct

    std::set<DirectProduct> generateAllElements() const {
CrossProduct crossProduct{ };
forIdx<std::tuple_size<std::tuple<MockElement...>>::value - 1>::template loop(crossProduct);
return crossProduct.result;
};

最佳答案

您说过“C++20 中的模板化 lambda”吗?

你是指下面的意思吗?

#include <iostream>
#include <type_traits>

template <std::size_t I>
void loop_func()
{ std::cout << I << ' '; };

int main ()
{
[]<std::size_t ... Is>(std::index_sequence<Is...>)
{ (loop_func<sizeof...(Is)-Is-1u>(), ...); }
(std::make_index_sequence<11u>{});
}

打印

10 9 8 7 6 5 4 3 2 1 0

关于c++ - 遍历具有 int 类型的模板化 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66664955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com