Nyt on tullut pientä pohdittavaa loppuparametrin kertomisessa std::copy -funktiolle.
Alkuperäinen koodi toimii hyvin
#include <fstream>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <regex>
int main() // tämä toimii alkuperäinen versio, versio 1
{
std::string text = "Quick brown fox.";
std::regex ws_re("\\s+"); // whitespace
std::copy( std::sregex_token_iterator(text.begin(), text.end(), ws_re, -1),
std::sregex_token_iterator(),
std::ostream_iterator<std::string>(std::cout, "\n")
);
}
jos alkuiteraattori annetaan kutsun ulkopuolella alustetulla muuttujalla, silloinkin ohjelma toimii hyvin.
#include <fstream>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <regex>
int main() // tämä toimii, versio 2
{
std::string text = "Quick brown fox.";
std::regex ws_re("\\s+"); // whitespace
std::sregex_token_iterator it1(text.begin(), text.end(), ws_re, -1);
std::copy( it1,
std::sregex_token_iterator(),
std::ostream_iterator<std::string>(std::cout, "\n")
);
}
Mutta jos loppukohta annetaan funktion ulkopuolella alustetulla parametrilla, tulee käännöksessä virheitä.
#include <fstream>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <regex>
nt main() // tämä ei toimi, versio 3
{
std::string text = "Quick brown fox.";
std::regex ws_re("\\s+"); // whitespace
std::sregex_token_iterator it1(text.begin(), text.end(), ws_re, -1);
std::sregex_token_iterator stop();
std::copy( it1,
stop,
std::ostream_iterator<std::string>(std::cout, "\n")
);
}
Vaikka versioita 1 ja 2 voi käyttää, joskus olisi siistimmän näköistä, jos voisi käyttäa myös 3-versiota, mutta miten sen voisi saada toimimaan. Miten loppukohdan voisi kertoa funktion ulkopuolisella muuttujalla.
Käännöskomento oli kaikissa
g++ regex07.cpp -o regex07 -std=c++17 -Wall -pedantic
kun lähdekoodi on regex07.cpp (eli kaikenlaista on yritetty, ainakin 7:s yritys menossa)