我想为仅从第二次迭代运行的 for 循环创建一个辅助函数,因为我有很多具有以下模式的代码:
firstItem = true;
for (unsigned i = 0; i < 5; ++i)
{
firstItem ? firstItem = false : std::cout << ",\n";
std::cout << i;
}
我开始为此考虑一个辅助函数,并提出了这个解决方案:
template <typename T>
void fromSecondIter(T fn)
{
static bool firstItem = true; // because of this it works with unique types only
if (firstItem)
firstItem = false;
else
fn();
}
我的问题是,当 T 是唯一类型时,此解决方案可以正常工作。所以传递一个 lambda 是可以的,但是传递一个函数会默默地导致错误。然后我将该 fn 参数包装为 lambda,但令人惊讶的是它没有帮助;
这是一个完整的例子:
#include <type_traits>
#include <iostream>
#include <functional>
template <typename T>
void fromSecondIter(T fn)
{
static bool firstItem = true;
if (firstItem)
firstItem = false;
else
fn();
}
template <typename T>
void iterTest(T fn)
{
std::cout << "Numbers: ";
for (unsigned i = 0; i < 5; ++i)
{
fromSecondIter([&fn](){ fn(); }); // bad, why lambda is not unique here???
std::cout << i;
}
std::cout << std::endl;
}
void foo()
{
std::cout << ", ";
}
void test()
{
iterTest([](){ std::cout << ", "; }); // ok, lambda is unique
iterTest([](){ std::cout << ", "; }); // ok, lambda is unique
iterTest(foo); // ok
iterTest(foo); // bad
}
int main()
{
test();
return 0;
}
这打印:
Numbers: 0, 1, 2, 3, 4
Numbers: 0, 1, 2, 3, 4
Numbers: 0, 1, 2, 3, 4
Numbers: , 0, 1, 2, 3, 4