我有这个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?
我会这样做:
#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>>();
}