假设
10
是一个编译时常量...
#include <cstddef>
#include <utility>
template<std::size_t N>
struct do_N_times_type {
template<typename Lambda>
void operator()( Lambda&& closure ) const {
closure();
do_N_times_type<N-1>()(std::forward<Lambda>(closure));
}
};
template<>
struct do_N_times_type<1> {
template<typename Lambda>
void operator()( Lambda&& closure ) const {
std::forward<Lambda>(closure)();
}
};
template<>
struct do_N_times_type<0> {
template<typename Lambda>
void operator()( Lambda&& closure ) const {
}
};
template<std::size_t N, typename Lambda>
void do_N_times( Lambda&& closure ) {
do_N_times_type<N>()( std::forward<Lambda>(closure) );
};
#include <iostream>
void f() {
std::cout << "did it!\n";
}
int main() {
do_N_times<10>([&]{
f();
});
}
或者只是
int main() {
do_N_times<10>(f);
}
其他荒谬的方法:
编写一个范围迭代器(我称之为index
),它产生整数类型的迭代器范围(我默认使用std::size_t
)。然后输入:
for( auto _:index_range(10) )
这段代码使用了一个变量 (_
),但看起来非常令人困惑。
另一种疯狂的方法是创建一个类似 Python 的生成器。编写一个生成器包装器,它接收一个可迭代范围并产生一个返回范围的 value_type
的 std::optional
的函数并不复杂。
然后我们可以这样做:
auto _ = make_generator( index_range(10) );
while(_()) {
}
这将创建一个临时变量,并且更加晦涩。
我们可以编写一个在生成器上操作的循环函数:
template<typename Generator, typename Lambda>
void While( Generator&& g, Lambda&& l ) {
while(true) {
auto opt = g();
if (!opt) return;
l(*opt);
}
}
然后我们可以像这样调用:
While( make_generator( index_range(10) ), [&](auto&&){
f();
});
但是这样会在函数中创建一些临时变量,而且比上一个方法更荒谬,并依赖于尚未最终确定的C++1y的功能。
这些都是我尝试创建无需变量重复10次某些操作的方式。
但实际上,我只会使用循环。
您几乎可以通过键入x=x;
来阻止警告。
或者编写一个函数。
template<typename Unused>
void unused( Unused&& ) {}
并且调用 unused(x);
-- 变量 x
被使用,但其名称在内部被省略了,因此编译器可能不会在内部警告您。
因此,请尝试这样做:
template<typename Unused>
void unused( Unused&& ) {}
for(int x{};x<10;++x) {
unused(x);
f();
}
应该抑制警告,并且更易于理解。
for (auto x : boost::irange(0, 10)) f();
的代码会给出一个警告,因为x
没有被使用。 - chrisx
被写入但从未被读取,导致编译器发出警告。 - Mooing Duckx<10;
读取x
吗? - Yakk - Adam Nevraumontfor (auto x : boost::irange(0, 10))
不包含表达式x<10
。它更像是一个语句auto x = *__secret_iterator1;
。 - aschepler