LINUX.ORG.RU

История изменений

Исправление eao197, (текущая версия) :

Т.е., здравствуй Си :-)

Шиза косит? Это же вам потребовалось задействовать C-шные функции для C++ных строк. Отсюда и необходимость в промежуточной C-шной строке. Для чего нужен буфер, с нулевым символом в конце.

Использование vector дает этот самый буфер. Причем с RAII сразу. Причем с исключением в случае нехватки памяти.

Да и работать это будет, скорее всего, шустрее strdup, т.к. strdup-у нужно сначала найти 0-символ в исходной строке, а это лишний проход по памяти.

Ну и если смущает, что process_path может дернуть кто угодно и передать что угодно, то решается это несколькими способами. Самый простой — определить process_path внутри пространства имен impl или details и объявить это пространство имен деталями реализации. Соответственно, если кто-то вызвал process_path, тот сам себе буратино. Если же хочется хардкорного контроля, то опять же без трехэтажных шаблонов:

class path_processor {
  friend std::string path_basename(const std::string &);
  friend std::string path_dirname(const std::string &);

  template<typename F>
  static std::string process(const std::string &, F f) {...}
};

Исходная версия eao197, :

Т.е., здравствуй Си :-)

Шиза косит? Это же вам потребовалось задействовать C-шные функции для C++ных строк. Отсюда и необходимость в промежуточной C-шной строке. Для чего нужен буфер, с нулевым символом в конце.

Использование vector дает этот самый буфер. Причем с RAII сразу. Причем с исключением в случае нехватки памяти.

Да и работать это будет, скорее всего, шустрее strdup, т.к. strdup-у нужно сначала найти 0-символ в исходной строке, а это лишний проход по памяти.

Ну и если смущает, что process_path может дернуть кто угодно и передать что угодно, то решается это несколькими способами. Самый простой — определить process_path внутри пространства имен impl или details и объявить это пространство имен деталями реализации. Соответственно, если кто-то вызвал process_path, тот сам себе буратино. Если же хочется хардкорного контроля, то опять же без трехэтажных шаблонов:

class path_processor {
  friend std::string path_basename(const std::string &);
  friend std::string path_dirname(const std::string &);

  template<typename F>
  static std::string process(const std::string, F f) {...}
};