Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C++:在不传递100万个参数的情况下分解代码

C++:在不传递100万个参数的情况下分解代码
EN

Stack Overflow用户
提问于 2016-06-13 00:08:46
回答 2查看 112关注 0票数 3

我正在进行C/C++编程(主要是C++),我发现自己需要分解代码,这些代码实际上是原来的两倍,除非每次出现的“左”都被替换为“右”。一旦代码完成,我需要知道它是正在执行的“左”或“右”版本,但仅此而已,它们都将返回一个我可以理解的数字(一旦与左或右信息组合在一起)。

在这个设置中,每个更改都需要进行两次,这是很烦人的。

因此,我可以简单地用"other“替换左/右,然后调用两次分解函数,每次都知道我是为”左“还是”右“调用它。

现在,当我们到达代码的那一部分时,已经有了一百万个变量(游标、ID、数组正在填充等)。所以,如果我想分解左/右代码,我需要这个函数有一个非常多的参数,这看起来很难看。

我也不想用只在本例中使用的属性重载我的C++类。

有什么建议可以使这里顺利地分解吗?

代码语言:javascript
运行
AI代码解释
复制
    int arrayRight[many], arrayLeft[many], cursor;

    while(1)
    {
         rightThing = arrayRight[cursor];
         // Process with RightThing assigned
         // ...
         // ...
         // ...

        leftThing = arrayLeft[cursor]
         // Process with RightThing assigned
         // ...
         // ...
         // ...

        cursor++;
   }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-13 00:20:05

尝尝这个?(它只在C++14上工作,因为它使用自动lambda)

代码语言:javascript
运行
AI代码解释
复制
auto func = [&](auto& theThing){
    // blah, blah code
};

func(arrayRight[cursor]);
func(arrayLeft [cursor]);

这里的[&]意味着将相同作用域中的所有变量导入lambda函数。

对于较早的C++版本,我使用以下代码作为一种丑陋的方式(在学校的C99项目中)。

代码语言:javascript
运行
AI代码解释
复制
int* pData[2] = {arrayRight, arrayLeft};
for (int i=0; i<2; i++)
{
    int* theThing = pData[i];
    // blah, blah
}

我的一些朋友告诉我宏可以持有VA_ARGS,所以这里有一个宏方法。这应该适用于GCC。但对于MSVC 2003来说,它不起作用。(__typeof需要被boost::typeof取代,并且在较早版本的MSVC中不支持匿名结构定义)

代码语言:javascript
运行
AI代码解释
复制
#define in(...) __VA_ARGS__
#define PP_ARG_N( \
          _1,  _2,  _3,  _4,  _5,  _6,  _7,  _8,  _9, _10, \
         _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \
         _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, \
         _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, \
         _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, \
         _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, \
         _61, _62, _63, N, ...) N
#define PP_RSEQ_N()                                        \
         63, 62, 61, 60,                                   \
         59, 58, 57, 56, 55, 54, 53, 52, 51, 50,           \
         49, 48, 47, 46, 45, 44, 43, 42, 41, 40,           \
         39, 38, 37, 36, 35, 34, 33, 32, 31, 30,           \
         29, 28, 27, 26, 25, 24, 23, 22, 21, 20,           \
         19, 18, 17, 16, 15, 14, 13, 12, 11, 10,           \
          9,  8,  7,  6,  5,  4,  3,  2,  1,  0
#define PP_NARG_(...)    PP_ARG_N(__VA_ARGS__)
#define PP_NARG(...)     PP_NARG_(__VA_ARGS__, PP_RSEQ_N())

#define withInternal(dataType, desiredType, x, dataCnt, data...) for(struct {size_t __i; dataType __t[dataCnt];} __s = {0, data}; x = __s.__t[__s.__i], __s.__i < dataCnt; __s.__i++)
#define with(x, ...) withInternal(__typeof(__VA_ARGS__), __typeof(__VA_ARGS__), x, PP_NARG(__VA_ARGS__), __VA_ARGS__)
#define withConst(x, ...) withInternal(__typeof(__VA_ARGS__), __typeof((__VA_ARGS__) + 0), x, PP_NARG(__VA_ARGS__), __VA_ARGS__)
#define withType(tn, x, ...) withInternal(tn, tn, x, PP_NARG(__VA_ARGS__), __VA_ARGS__)

当你使用它时:

代码语言:javascript
运行
AI代码解释
复制
int main()
{
    int x;
    int s1=2, s2=3;
    with(x, in(s1, s2))
        cout<<x<<endl;
    withConst(x, in(45, 55))
        cout<<x<<endl;
    withType(int, x, in(45, s1, 55, s2))
        cout<<x<<endl;
    return 0;
}

我相信这是比较清楚的。

  • with使用变量(基本上),因为当将consts传递给with时,gcc __typeofx生成一个无法分配的自动const类型。
  • withConst使用x+0技巧来删除const类型的变量,但是+操作符并不适用于每一种数据类型,因此它有其局限性。
  • withType指定一种数据类型,它适用于混合情况。
票数 4
EN

Stack Overflow用户

发布于 2016-06-13 00:26:51

我想你可以试着把这些东西分批到一起:

代码语言:javascript
运行
AI代码解释
复制
while(1)
{
    vector<int> things;

    int rightThing = arrayRight[cursor];
    things.push_back(rightThing);

    int leftThing = arrayLeft[cursor];
    things.push_back(leftThing);

    for(vector<int>::iterator thing = things.begin(); thing != things.end(); ++thing)
    {
        // Process Thing
        // ...
        // ...
        // ...
    }

    cursor++;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37784640

复制
相关文章
如何在Python中将字典键作为列表返回?
参考链接: Python字典keys() 本文翻译自:How to return dictionary keys as a list in Python?  In Python 2.7 , I cou
用户7886150
2021/01/25
2.2K0
如何在Python中将列表转换为字符串?
Python provides different variable type for programmers usage. We can use int, float, string, list, set … data types in our applications. While using different type of variables we may need to convert then to different types. In this tutorial we will different type of conversion from list to string in Python.
全栈程序员站长
2022/08/12
4.7K0
Python将一个数逆序列放入列表中
小小科
2020/06/15
1.2K0
【说站】Python如何在列表中添加新值
1、append()将元素添加到集合,insert()将元素插入指定的下标应用程序,返回值为None。
很酷的站长
2022/11/24
4.3K0
【说站】Python如何在列表中添加新值
如何在 Python 中计算列表中的唯一值?
Python 提供了各种方法来操作列表,这是最常用的数据结构之一。使用列表时的一项常见任务是计算其中唯一值的出现次数,这在数据分析、处理和筛选任务中通常是必需的。在本文中,我们将探讨四种不同的方法来计算 Python 列表中的唯一值。
很酷的站长
2023/08/11
7230
如何在 Python 中计算列表中的唯一值?
访问列表中的值
#!/usr/bin/python list1 = ['physics', 'chemistry', 1997, 2000] list2 = [1, 2, 3, 4, 5, 6, 7 ] print "list1[0]: ", list1[0] print "list2[1:5]: ", list2[1:5]
用户8442333
2021/05/27
5.8K0
如何在Dart中合并列表
在 Dart 编程中,List 数据类型类似于其他编程语言中的数组。列表用于表示对象的集合。它是一组有序的对象。Dart 中的核心库负责 List 类的存在、创建和操作。有 5 种方法可以组合两个或多个列表:
徐建国
2021/12/01
2.2K0
flutter - 如何在Dart/Flutter中将某些元素从一个Map复制到新Map中?
由于keys返回 map 键的Iterable<String>,因此您可以使用where方法检查所需的键,然后可以基于旧 map 值填充值。
徐建国
2021/08/30
1.4K0
Golang 中函数作为值与类型
在 Go 语言中,我们可以把函数作为一种变量,用 type 去定义它,那么这个函数类型就可以作为值传递,甚至可以实现方法,这一特性是在太灵活了,有时候我们甚至可以利用这一特性进行类型转换。作为值传递的条件是类型具有相同的参数以及相同的返回值。
张乘辉
2019/06/14
1.7K0
[Go] golang中接口值(interface)的比较
当写项目的过程中 , 有时候进行逻辑判断 , 如果没注意对两个interface类型的变量进行比较 , 会造成混乱问题
唯一Chat
2021/01/21
3.8K0
如何在终端和 PowerShell 中将一个命令自动重复执行多次
你可能有很多原因要将一个命令重复执行多次,本文介绍在多个平台下如何多次重复执行命令。
walterlv
2020/03/12
4K0
如何在 Python 中将数字转换为字母?
在编程中,有时我们需要将数字转换为字母,例如将数字表示的年份转换为对应的字母表示,或者将数字编码转换为字母字符。Python 提供了多种方法来实现这种转换。本文将详细介绍在 Python 中将数字转换为字母的几种常用方法,并提供示例代码帮助你理解和应用这些方法。
网络技术联盟站
2023/06/01
2K0
python中将dict存入list中,list值仍然随着dict变化【Flask】
在一次将数据库查询结果手动转化为json数据(obj转json)的过程中,发现前端得到的每条数据都是一样的,,,,简述为,列表存入字典值后值会变化,代码如下:
来杯Sherry
2023/05/25
3690
如何在js中将统计代码图标隐藏
  建站时我们都会加一下网站统计,方便把控内容的内容的运营。大部分站长安装的站点统计是第三方统计代码,js形式的,很少用以服务器日志为基础分析的统计。(当然能通过网站日志来分析网站的运营者比一般的站长水平相对要高一些,也更会折腾。因为很多统计都没记录蜘蛛的轨迹)普通的js统计代码就能满足大多数的需求。安装统计代码想必大家闭着眼睛都会,但如果网站是静态页面的话,那每个页面都要添加到,即使安装在统一调用的页脚,那生成页面也需要一定的时间。有没更便捷的办法呢?将统计代码写进常用的js文件中。   将统计代码写进j
ytkah
2018/03/05
13.5K0
如何在js中将统计代码图标隐藏
Python中将字典转换为有序列表、无序列表的方法
说明:列表不可以转换为字典 1.转换后的列表为无序列表 a = {'a' : 1, 'b': 2, 'c' : 3} #字典中的key转换为列表 key_value = list(a.keys()
用户1214487
2018/04/13
3.6K0
Python中将字典转换为有序列表、无序列表的方法
如何在小程序里面放入企业官网注意:
小程序解析html网页标签,有3种方法: 1:使用 wxParse 解析html 2:单独解析 html标签 3:使用最新的小程序组件 web-view 前段时间,微信正式宣布为方便开发者灵活配置小程序,小程序现开放内嵌 Web 页面能力,但这个开放的能力也具有一定的局限性,小程序如果想要内嵌网页,那域名只能是自己公司的,对这个网站拥有控制权才可以。 参考文档:https://mp.weixin.qq.com/debug/wxadoc/dev/component/web-view.html 在小程序里
王小婷
2018/06/01
1.2K0
如何在 .Net 7 中将 Query 绑定到数组
在 .Net 7 中,我们可以通过绑定数组的方式来接收来自查询字符串的参数。这样就不需要再使用逗号分隔的字符串来获取参数了。
newbe36524
2023/08/23
1490
flutter - 如何在 dart/flutter 中收听流值
如果流不是广播流,则您只能收听一次。 请参阅此 Medium post 以了解有关 Streams 的更多信息。 收听 stream 时,您需要在 _assetsAudioPlayer.currentPosition 函数中添加您的代码。
徐建国
2021/08/30
1.1K0
idea将多个项目放入一个模块中如何各自运行
导入完成后,出现新项目目录,在目录下找到红色报错的目录删除掉,导入自己的,下面是我删除、导入后的样子、
2020/10/23
2.8K0
idea将多个项目放入一个模块中如何各自运行
点击加载更多

相似问题

如何在golang中将regexp放入proto struct中?

228

如何在golang中将值放入可选字符串参数中?

119

如何在golang urfave cli中将标志值传递给子命令

10

如何在golang中将tar文件放入tar文件中?

21

如何在XPages中将数字列表放入组合框值列表

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档