参数包到参数包的映射

时间:2019-10-19 22:08:42

标签: c++ templates variadic-templates

我想将参数包重新映射到其他类型的参数包。 更准确地说,我有一个功能:

// 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

在标准中是否有提及包扩展行为的地方-即可以在顶部应用功能的事实?

2 个答案:

答案 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);