    #include <iostream>
    #include <iterator>
    #include <vector>
    #include <regex>
     
    std::vector<int> parse(const std::string &iStr) {
      std::vector<int> Ret;
      std::vector<std::string> Tmp; 
      std::string Work(iStr);
      Work.erase(0,Work.find_first_not_of(' '));
      Work.erase(Work.find_last_not_of(' ')+1); 
      if (Work.length() == 0) throw std::invalid_argument("Пустая строка");
      if (Work[0] == ',') throw std::invalid_argument("В первой позиции не число");
      if (Work[Work.length()-1] == ',') throw std::invalid_argument("В последней позиции не число");  
      std::regex Rx("\\s*,\\s*");
      std::sregex_token_iterator Begin(Work.begin(), Work.end(), Rx, -1);
      std::sregex_token_iterator End;
      while (Begin != End) Tmp.push_back((Begin++)->str());
      Rx = "^\\s*((\\+|-)?[0-9]+)\\s*,?\\s*$";
      int Pos = 0;  
      for(const auto &i:Tmp) {  
        std::smatch Match;  
        std::regex_search(i, Match, Rx);
        if (Match.size() == 3) 
          try { 
          	Ret.push_back(std::stoi(Match.str(1),nullptr,10)); 
          } catch(...) {
          	throw std::invalid_argument("В позиции "+std::to_string(Pos)+" слишком длинное число");
          } 
        else throw std::invalid_argument("В позиции "+std::to_string(Pos)+" не число");
        Pos++;                
      }  
      return Ret;
    }
     
    int main() {
      for(const auto &i: {	
        "1, 4, 5, -6, -8 , 3, 1",
        "1, 3333333333333333333333333334, 5, -6, -8 , 3, 1",        
        "       5 , 6, 57, +68 , 18, 32, 4   ",
        "77",
        "",
        "    ",
        "1, 4, 5, 6, 8, 3, 1,",
        " , 6, 57, 68 , 18, 32, 4",
        "5, 6, , 68, 18, 32, 4",
        "5, 6,, 68, 18, 32, 4",
        "5, 6, T, 68, 18, 32, 4",
        "5, 6, 34T, 68, 18, 32, 4",
        "5, 6, 34 55, 68, 18, 32, 4",
        ",",
        ",,",
        ",, ,, ,,,"}) { 
        try {
      	  std::cout << "\"" << i << "\": ";
      	  parse(i);
      	  std::cout << "Ok";
        } catch (std::invalid_argument &E) {
          std::cout << E.what();
        }  
        std::cout << std::endl;
      }  
      return 0;
    }