是否可以使用元组中传递的参数的所有可能的 K 组合(带重复)来调用方法?

2023-12-03

所需的行为可以如下所示:

void foo(int x, int y) {
    std::cout << x << " " << y << std::endl;
}

int main() {
    all_combinations<2>(foo, std::make_tuple(1, 2)); // K = 2 
    // to run: 
    // foo(1, 1)
    // foo(1, 2)
    // foo(2, 1)
    // foo(2, 2)
}

c++14 版本可能如下所示:

#include <tuple>
#include <utility>
#include <iostream>
#include <initializer_list>


template <class Foo, class Tuple, size_t... Is, size_t... Is2>
int all_combinations_impl(Foo foo, Tuple t, std::index_sequence<Is...> , std::integral_constant<size_t, 0>, std::index_sequence<Is2...>) {
   foo(std::get<Is>(t)...);
   std::cout << std::endl;
   return 0;
}

template <class Foo, class Tuple, size_t... Is, size_t K, size_t... Is2>
int all_combinations_impl(Foo foo, Tuple t, std::index_sequence<Is...>, std::integral_constant<size_t, K>, std::index_sequence<Is2...> is) {
   std::initializer_list<int> all = {all_combinations_impl(foo, t, std::index_sequence<Is..., Is2>{}, std::integral_constant<size_t, K-1>{}, is)...};
   (void)all;
}

template <size_t K, class Foo, class Tuple>
void all_combinations(Foo foo, Tuple t) {
   all_combinations_impl(foo, t, std::index_sequence<>{}, std::integral_constant<size_t, K>{}, std::make_index_sequence<std::tuple_size<Tuple>::value>{});
}

int main() {
   all_combinations<2>([](auto... args) { std::forward_as_tuple((std::cout << args)...); }, std::make_tuple("1 ", "2 ", "3 "));
}

不幸的是c++11没有附带std::integer_sequence,所以我们需要做额外的实现:

#include <tuple>
#include <utility>
#include <iostream>
#include <initializer_list>

template <class T, T... Vs>
struct integer_sequence { };

template <class T, class, class, class = integer_sequence<T>, class = integer_sequence<T, 0>, class = void>
struct make_integer_sequence_impl;

template <class T, T ICV1, T... Res, T... Pow>
struct make_integer_sequence_impl<T, std::integral_constant<T, ICV1>, std::integral_constant<T, 0>, integer_sequence<T, Res...>, integer_sequence<T, Pow...>, typename std::enable_if<(ICV1 > 0)>::type>: make_integer_sequence_impl<T, std::integral_constant<T, ICV1/2>, std::integral_constant<T, ICV1%2>, integer_sequence<T, Res...>, integer_sequence<T, Pow..., (Pow + sizeof...(Pow))...>> { };

template <class T, T ICV1, T... Res, T... Pow>
struct make_integer_sequence_impl<T, std::integral_constant<T, ICV1>, std::integral_constant<T, 1>, integer_sequence<T, Res...>, integer_sequence<T, Pow...>, void>: make_integer_sequence_impl<T, std::integral_constant<T, ICV1/2>, std::integral_constant<T, ICV1%2>, integer_sequence<T, Pow..., (Res + sizeof...(Pow))...>, integer_sequence<T, Pow..., (Pow + sizeof...(Pow))...>> { };

template <class T, class Res, class Pow>
struct make_integer_sequence_impl<T, std::integral_constant<T, 0>, std::integral_constant<T, 0>, Res, Pow, void> {
   using type = Res;
};

template <class T, T V>
using make_integer_sequence = typename make_integer_sequence_impl<T, std::integral_constant<T, V/2>, std::integral_constant<T, V%2>>::type;

template <size_t V>
using make_index_sequence = make_integer_sequence<size_t, V>;

template <size_t... V>
using index_sequence = integer_sequence<size_t, V...>;

template <class Foo, class Tuple, size_t... Is, size_t... Is2>
int all_combinations_impl(Foo foo, Tuple t, index_sequence<Is...> , std::integral_constant<size_t, 0>, index_sequence<Is2...>) {
   foo(std::get<Is>(t)...);
   std::cout << std::endl;
   return 0;
}

template <class Foo, class Tuple, size_t... Is, size_t K, size_t... Is2>
int all_combinations_impl(Foo foo, Tuple t, index_sequence<Is...>, std::integral_constant<size_t, K>, index_sequence<Is2...> is) {
   std::initializer_list<int> all = {all_combinations_impl(foo, t, index_sequence<Is..., Is2>{}, std::integral_constant<size_t, K-1>{}, is)...};
   (void)all;
}

template <size_t K, class Foo, class Tuple>
void all_combinations(Foo foo, Tuple t) {
   all_combinations_impl(foo, t, index_sequence<>{}, std::integral_constant<size_t, K>{}, make_index_sequence<std::tuple_size<Tuple>::value>{});
}

struct s {
   template <class... Args>
   void operator()(Args... args) const {
      std::forward_as_tuple((std::cout << args)...);
   }
};

int main() {
   all_combinations<3>(s{}, std::make_tuple("1 ", "2 ", "3 "));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以使用元组中传递的参数的所有可能的 K 组合(带重复)来调用方法? 的相关文章

随机推荐

  • 将新元素添加到映射后出现“不是‘map-get’的映射”错误

    如何将映射合并到 sass 中的现有映射中 我目前正在使用 sass 地图 config部分来定义我的断点 例如 breakpoints small 35rem medium 55rem large 75rem xlarge 90rem e
  • @EJB 注释与 JNDI 查找

    是否存在使用 JNDI 比使用注入无状态会话 bean 更好的情况 EJB注解 我们将 JSF 1 2 与 Sun Application Server 9 0 01 结合使用 我们的团队正在讨论在托管 Bean 中使用 SLSB 时哪种方
  • 如何防止长按 EditText Widget 时显示虚拟键盘?

    我的应用程序中有一个 EditText 小部件 我已将其设置为只读 我想知道用户何时长按它 如果用户点击此小部件 我不希望弹出虚拟键盘 为了阻止虚拟键盘出现 我使用这个 EditText 文本 EditText findViewById R
  • 插入数据并获取返回的 id 后如何修复 DapperExtensions 错误

    I use 简洁的扩展将数据拉取和推送到数据库 I use unsigned intid 作为我的主键database并在class以及 我的课看起来像这样 public class Product Column id public uin
  • CodePipeline 的 Cloudformation 模板

    我们有一个 aws 设置 其中有一个测试帐户和一个生产帐户 我们的代码提交 java lambda 位于我们的测试帐户中 我们希望使用 CodePipeline 将代码从此处部署到我们的测试帐户和生产帐户 我想知道是否有人知道任何可以执行此
  • 另一个视图控制器中属性的内联 KVO

    我有一个带有动态变量 值 的 vc 我需要知道它何时在调用 cv 的闭包中发生更改 目标VC objc dynamic var value String source if let vc TagButtonPopupViewControll
  • 如何确认邮件来源

    我从我的 smtp 服务器发送电子邮件 例如 设置From to 电子邮件受保护 收件人会认为电子邮件来自anydomain 如何确认邮件来源 处理电子邮件伪造的方法有多种 Use PGP or SSL 签名证书 Use SPF 检查Rec
  • 使用 css 在子菜单前添加三角形

    如何在下面的示例中添加三角形Fiddle 我需要删除具有白色背景的父菜单并显示三角形以使其看起来更像这样 我尝试添加以下 css 但它不起作用 dropdown li first child gt a after content posit
  • 以编程方式将文件夹复制并粘贴到映射的网络驱动器中

    我试图在映射的网络驱动器上复制一个文件夹 不是文件 而是整个目录 并将其新版本以不同的名称粘贴到同一位置 如果我使用本地驱动器 下面的代码效果很好 但是 我在使用网络驱动器时遇到身份验证错误 DirectoryCopy mappedserv
  • 在 Java-8 中重构多个 If' 语句

    我需要验证班级中的必填字段 例如 9字段不得是null 我需要检查它们是否全部为空 但我现在使用多个 if 语句 如下所示 StringBuilder mandatoryExcessFields new StringBuilder MAND
  • 没有 ObservableDataService 的提供者

    我收到错误 No provider for ObservableDataService ObservableDataService https github com sanex3339 bannerscreator blob master
  • 使用 mutate_at 用列名更新单元格值

    我正在处理调查数据 有些问题要求参与者检查所有适用于他们的选项 在我当前拥有的数据框中 每个可能的响应都有一列 如果参与者选择了该选项 则记录值为 1 例如 对于问题 您在工作中经历过以下哪种情绪 使用选项 无聊 压力 满足 我的数据框将如
  • 将表单输入值发送到 URL

    我有一个简单的搜索表单
  • GitHub 中的分支之间合并

    我分叉了一个 GitHub 存储库 然后我向我的叉子推送了一些更改 然后原始存储库合并了我的更改和其他一些更改 现在 我想合并那些我缺少的更改 我尝试了简单的拉动 然后推送 但这会产生重复的提交 最好的方法是什么 您可能对每个存储库都有一个
  • ModuleNotFoundError:没有名为“camelot”的模块

    我想从 pdf 中提取表格并为此 我用的是卡米洛特 但每当我尝试导入它时 我都会收到此错误 import camelot Traceback most recent call last File
  • C/C++签名中两个const的含义

    我一直在包装一个 gl 文件scheme并且失败了两次gl h标头 我使用的是 OSx 所以它可能依赖于平台 但我在生活中的其他地方从未见过这种语法 typedef void glMultiDrawElementsProcPtr GLenu
  • 使用结构体在 C 中输入 CSV 文件

    我想打印来自的数据 csv逐行文件 由comma分隔符 此代码打印垃圾值 enum gender M F struct student int stud no enum gender stud gen char stud name 100
  • 使用 EF4 实施识别关系

    我目前的情况是需要删除实体而无法访问关联的实体ObjectContext 我读到了有关识别关系的内容 它们似乎正是我所需要的 一旦一个对象不再被其 父 对象引用 我想删除该对象 我正在使用 Visual Studio 2010 Premiu
  • 如何在Python中比较列表/集合的列表?

    比较两个列表 集合并输出差异的最简单方法是什么 是否有任何内置函数可以帮助我比较嵌套列表 集合 Inputs First list Test doc 1a1a1a 1111 Test2 doc 2b2b2b 2222 Test3 doc 3
  • 是否可以使用元组中传递的参数的所有可能的 K 组合(带重复)来调用方法?

    所需的行为可以如下所示 void foo int x int y std cout lt lt x lt lt lt lt y lt lt std endl int main all combinations lt 2 gt foo std