次のパターンのコードがたくさんあるため、2 回目の反復からのみ実行される for-cycle のヘルパー関数を作成したいと考えています。
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 が一意の型の場合、このソリューションが正しく機能することです。したがって、ラムダを渡すことは問題ありませんが、関数を渡すと暗黙のうちにエラーが発生します。次に、その fn パラメーターをラムダにラップしましたが、驚くべきことに、それは役に立ちません。
完全な例を次に示します。
#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