【发布时间】:2017-01-19 23:04:35
【问题描述】:
我想使用宏来更简单地创建我的源代码
这是我的代码
constexpr auto make_index_sequence_array(size_t i ,std::index_sequence<arg...>) {
return std::array<size_t, sizeof...(arg)> {i+arg...};
}
#define RANGE(start , end) make_index_sequence_array(start,std::make_index_sequence<end-start>{})
#define ZeroTo(end) RANGE(0 , end)
#define Repeat(end) for(auto itr : RANGE(0 , end))
void main() {
vector<int> a = { 1,2,3 };
for (auto row : RANGE(0,a.size()))
cout << std::setw(4) << a[row];
cout << '\n';
}
我知道我可以使用:
void main() {
vector<int> a = { 1,2,3 };
for (auto itr: a)
cout << std::setw(4) << itr;
cout << '\n';
}
但这是一个简单的例子,我想在更多情况下使用这种风格。 编译时的错误是:
错误 C2975 '_Size':'std::make_index_sequence' 的模板参数无效,预期的编译时常量表达式
如何使用我的宏?甚至有可能吗?
【问题讨论】:
-
我的强烈意见如下:使用宏来缩短源代码是一个非常糟糕的主意。它隐藏了您想要查看的内容,并使查找错误成为一件非常痛苦的事情。宏有用处,但这不是一个好用的。
-
其实我想让它更简单
-
对于这种特殊情况,您可以使用
for (auto row : boost::irange(0, a.size())) -
首先,至少用括号将所有宏参数括起来,这样复杂的项目就不会导致它以意想不到的方式中断。
-
如错误提示,
a.size()不是编译时常量。您不能将其用作模板参数。