【发布时间】:2019-03-26 14:17:35
【问题描述】:
我正在寻找一种方法来用更现代的东西替换这个 C++ 预处理器宏。
#define fori(FORI_TYPE, FORI_FROM, FORI_TO) \
for(FORI_TYPE i{FORI_FROM}; \
((FORI_FROM) < (FORI_TO)) ? (i < (FORI_TO)) : (i > (FORI_TO)); \
((FORI_FROM) < (FORI_TO)) ? ++i : --i )
理想情况下,我可以摆脱所有的 ?运算符(constexpr 在这里有用吗?)并且“fori”不会像现在使用处理器版本那样产生任何开销成本(评估 ? 运算符)。另外,键入安全性。
使用示例:
fori(size_t, 0, n)
{
cout << i << endl;
}
【问题讨论】:
-
您是否需要遍历范围内的所有数字,或者您打算使用
i作为容器的索引(即您想要遍历项目)? -
宏被用在各种各样的上下文中,它可以用作索引或计算,等等。这适用于多项目范围的使用。
-
@Aziuth 改成what,我觉得是重点
-
只是个人建议:不要。只是不要。宏不好,因为它们难以编写、读取和调试,但如果它们满足您的需求,就使用它们。现代 C++ 元编程肯定比旧的 C 预处理器宏好一点,但代码并不是真的更容易理解或调试……如果你想改变一些东西,教育程序员使用这种语言。使用元编程来只保存几个字符是,呃……我不喜欢的东西。
-
您可以考虑使用
iota_view中的 range-v3,它正在添加到 C++20 中
标签: c++ c-preprocessor