// BEFORE
template<typename Iterator, typename Dist>
void advance(Iterator & i, Dist n)
{
// create a brief version of template std::iterator_traits<Iterator>::iterator_category
typename std::iterator_traits<Iterator>::iterator_category c;
advance_impl(i, n, c);
}
template <typename Iterator, typename Distance>
void advance_impl(Iterator &i, Distance n, std::random_access_iterator_tag)
{
i += n;
}
template <typename Iterator, typename Distance>
void advance_impl(Iterator &i, Distance n, std::bidirectional_iterator_tag)
{
if (n >= 0) while (n--) i++;
else while (n++) i--;
}
template<typename Iterator , typename Distance>
void advance_impl(Iterator &i, Distance n, std::input_iterator_tag)
{
while (n--) ++i;
}
I moje pytanie brzmi: Jak kompilator interpretuje deklaracje szablonów ? Czy jeśli są one w tym samym pliku to nie potrzebna jest wczesna deklaracja jak w przypadku klas/struktur , bo kompilator najpierw sprawdza cały plik w poszukiwaniu wszystkich szablonów ? Dopiero przy odpowiedniej konkretyzacji odwołuje się do schematu i konkretyzuje co trzeba.
Drugie pytanie: Czy jest możliwość że poniższy kod kiedykolwiek zadziała
struct string_pool
{
private:
std::mutex mtx_;
std::string pool_;
public:
std::string pop(std::size_t & new_cap)
{
std::string s;
if (std::lock_guard <std::mutex> aa(mtx_); !pool_.empty())
{
std::swap(s, pool_.back());
}
pool_.pop_back();
if(s.capacity() < new_cap)
s.reserve(new_cap);
return s;
}
};
Konkretnie chodzi mi o funkcje std::swap() w tym konkretnym kontekście (chyba że kontekst jest szerszy - dla niewtajemniczonych cały kod jest z
.
Jeśli jest możliwość utworzenia tematu zbiorczego dla całej konferencji to byłoby fajnie. Jak komuś się chce (a plusy za aktywność ponć na forum są to może odpowiedzieć.