我想将参数包重新映射到其他类型的参数包。 更准确地说,我有一个功能:
// stop wp removing especifics tags
function bz_uncoverwp_tiny_mce( $init )
{
// html elements being stripped
//put here any other tags in this same form
$init['extended_valid_elements'] = 'video[*], source[*], div[*], articles';
// don't remove line breaks
$init['remove_linebreaks'] = false;
// convert newline characters to BR
$init['convert_newlines_to_brs'] = true;
// don't remove redundant BR
$init['remove_redundant_brs'] = false;
// pass back to wordpress
return $init;
}
add_filter( 'tiny_mce_before_init', 'bz_uncoverwp_tiny_mce' );
基本上,我想通过将template<typename ...type_pack, typename Function = void(type_pack&&...)>
constexpr decltype(auto) zip(Function&& op, type_pack&&... pack)
{
static_for<0, N_lhs>([&](auto i)
{
op(pack[i]...);
});
return;
}
应用于pack元素来创建结果的参数包。请注意,这里的[]
是一个整数常量,而static_for是编译时,您可以假设i
是[]
。我对constexpr
没有太多控制权,因此它需要一个参数包而不是一个元组。
编辑:
似乎我对op
造成了误解,而实际上这是合法的C ++构造(我认为这是非法的)。所以看来我的static_for循环实际上出了点问题。我的问题本来是关于op(pack[i]...)
的,所以我会保持原样。
我准备了一个不更普遍的示例,而不使用op(pack[i]...)
,而是使用另一个任意函数来进行健全性检查:https://godbolt.org/z/h8Hbbt
在标准中是否有提及包扩展行为的地方-即可以在顶部应用功能的事实?
答案 0 :(得分:2)
基本上,我想通过将
[]
应用于pack元素来创建结果的参数包。
您的意思如下吗?
template <typename ... type_pack,
typename Function = void(decltype(std::declval<type_pack>()[0])...)>
constexpr decltype(auto) zip(Function&& op, type_pack&&... pack)
{
/* ... */
}
如果您想要得到更多测试的答案,请准备一个简单但完整的示例(主要是static_for
。
答案 1 :(得分:1)
可以根据模式扩展参数包。
template <typename... T>
void test(T... t) {
(std::cout << ... << static_cast<int>(t));
}
此处将其扩展为折叠表达式,但在常规包扩展中以相同的方式起作用。这里的模式为static_cast<int>(t)
,它将扩展为
std::cout << static_cast<int>(t1) << static_cast<int>(t2) << ... << static_cast<int>(tN);