我有这个 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?
要展平包,您可以使用
std::tuple
:演示
或者
std::apply
需要将常量包装到std::integral_constant
常规函数参数中constexpr
。演示
这是一个可能的解决方案,但请注意,它仅适用于结构
int
中的两个Pack
。这个想法是首先构建一个编译时数组,保存交错的值,然后可以将其作为模板参数发送给目标函数。
点击此处演示