Ich stoße zufällig auf dieses Problem.Warum funktioniert Postfix fehlgeschlagen und Präfix funktioniert gut, wenn ein Iterator als Argument übergeben und an der Endposition rekursiv?
Ich habe gedacht, dass Google es sicher lösen kann, aber nachdem ich mehrere Schlüsselwörter durchsucht habe, kann ich noch keine Antworten finden, die mich sehr verwirrt haben.
Wenn ich Präfix an Schwanz Position verwenden, Codes funktioniert:
template<class ContinerIterator, class F>
constexpr auto fun(ContinerIterator IteratorBegin, ContinerIterator IteratorEnd, F f)
{
switch (IteratorBegin == IteratorEnd)
{
case true: return;
case false: f(*IteratorBegin);
}
return fun(++IteratorBegin, IteratorEnd, f);
}
int main()
{
std::vector<int> a = { 1, 2, 3, 4 };
fun(std::begin(a), std::end(a), [](auto &a)->auto{a *= 2; });
for (auto v : a)
{
std::cout << v << std::endl;
}
return 0;
}
Drücken Sie eine beliebige Taste, um fortzufahren . . .
Howerer, wenn ich postfix verwenden, kommt IteratorBegin
Nerven iteratorEnd
und geht weit und weit weg, so segmentfault.
template<class ContinerIterator, class F>
constexpr auto fun(ContinerIterator IteratorBegin, ContinerIterator IteratorEnd, F f)
{
switch (IteratorBegin == IteratorEnd)
{
case true: return;
case false: f(*IteratorBegin);
}
return fun(IteratorBegin++, IteratorEnd, f);
}
void test()
{
}
int main()
{
std::vector<int> a = { 1, 2, 3, 4 };
fun(std::begin(a), std::end(a), [](auto &a)->auto{a *= 2; });
for (auto v : a)
{
std::cout << v << std::endl;
}
return 0;
}
Ich habe versucht auf MSVC, G ++, Clang, alles scheitert. Hier ist Fehlerliste des gcc:
Segmentation fault (core dumped)
Hier Clang ist:
Fehler aufgetreten ist (Timeout). Versuchen Sie es später noch einmal.
Es klingt wie Sie lernen müssen, können, wie ein Debugger zu verwenden, durch den Code zu treten. Mit einem guten Debugger können Sie Ihr Programm Zeile für Zeile ausführen und sehen, wo es von dem, was Sie erwarten, abweicht. Dies ist ein essentielles Werkzeug, wenn Sie programmieren wollen. Weiterführende Literatur: [Wie kleine Programme zu debuggen] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) – NathanOliver
Wenn Postfix nach der üblichen Semantik implementiert wird, sollte es sein offensichtlich. – StoryTeller
Es ist ungewöhnlich, eine switch-Anweisung auf diese Weise zu sehen. Ich würde einfach einen normalen alten if/else dafür benutzen. – templatetypedef