如何交错 C++ 模板参数包

问题描述 投票:0回答:1

我有这个c++模板函数

template <int N, int B, auto... Args>
void somefunc() {
    // do work...
}

,我可以这样称呼:

somefunc<1, true, 2, false>();

我想扩展API,以便客户端也可以像这样调用

somefunc

somefunc<Pack<1, true>, Pack<2, false>>(); // equivalent to somefunc<1, true, 2, false>()

,其中

Pack
是某个结构:

template <int N, bool B>
struct Pack
{
    static constexpr int value = N;
    static constexpr int flag = B;
};

一个简单的方法是尝试这样的事情:

template <typename... Packs>
void somefunc() {
    somefunc<Packs::value..., Packs::flag...>();
}

但这扩展到:

somefunc<1, 2, true, false>();

而不是:

somefunc<1, true, 2, false>();

有没有一种简单的方法可以按照描述的方式扩展API?

c++ overloading template-meta-programming parameter-pack non-type-template-parameter
1个回答
0
投票

我会这样做:

#include <iostream>
#include <concepts>
#include <format>

template<typename T>
concept IsPack = requires
{
    std::is_same_v<decltype(T::value),int>;
    std::is_same_v<decltype(T::flag),bool>;
};


template<int v, bool f>
struct Pack
{
    static constexpr int value{v};
    static constexpr bool flag{f};
};

template<IsPack... Packs>
void function()
{
    (( std::cout << std::format("{},{}\n", Packs::value, Packs::flag)),...);
}

int main()
{
    function<Pack<1,true>,Pack<2,false>>();
}
© www.soinside.com 2019 - 2024. All rights reserved.