I believe I now have a solution which works. Thanks to those who commented!
Aces are now adjusted for in draw_card
and soft 17s are handled in the dealer drawing.
void draw_card(vector<Card> &deck, vector<Card> &new_deck)
{
int card_index = (rand() % deck.size());
int soft_value;
int hard_value;
new_deck.push_back(deck[card_index]);
deck.erase(deck.begin() + card_index);
for (size_t i = 0; i < new_deck.size(); i++)
{
while ((total_value(new_deck) > 21 && new_deck[i].face == 4 && new_deck[i].value == 11))
{
new_deck[i].value = 1;
}
}
}
bool has_high_ace(vector<Card> &deck)
{
bool ace = false;
for(size_t i = 0; i < deck.size(); i++)
{
if (deck[i].face == 4 && deck[i].value == 11) return true;
else return false;
}
}
int dealer_drawing(vector<Card> &main_deck, vector<Card> &deck)
{
int total = total_value(deck);
while(total <= 16 || (total <= 17 && has_ace && has_high_ace))
{
draw_card(main_deck, deck);
total = total_value(deck);
}
return total;
}