Szablony, std::swap – dwa pytania

0
// 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ć.

0

Dopiero przy odpowiedniej konkretyzacji odwołuje się do schematu i konkretyzuje co trzeba.

W przypadku funkcji szablonowych taka deklaracja IMO nie jest potrzebna, bo w trakcie pierwszej fazy kompilacji kompilator i tak nie jest w stanie sprawdzić poprawności wywołania. Dopiero podczas drugiej fazy - konkretyzacji - definicja/definicja funkcji szablonowej jest konieczna. Oczywiście mogę się mylić :)

std::swap(s, pool_.back());

s to std::string, a back zwraca referencję do wartości typu char. Oba argumenty muszą być tego samego typu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1