循环使用 int 类型的模板化 C++ 函数

Joy*_*bon 3 c++ templates template-meta-programming variadic-templates c++20

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

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{});
}
Run Code Online (Sandbox Code Playgroud)

该函数用于创建元组元素的笛卡尔积。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);
                }
        };
    };
Run Code Online (Sandbox Code Playgroud)

DirectProduct利用CrossProduct在它自己的generateAllElements()功能

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

max*_*x66 5

“C++20 中的模板化 lambdas”你说过吗?

你的意思如下?

#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>{});
 }
Run Code Online (Sandbox Code Playgroud)

那个打印

10 9 8 7 6 5 4 3 2 1 0
Run Code Online (Sandbox Code Playgroud)