
Since boost::filesystem::basic_path is trying to stay in sync with std::basic_string, I'd like to at least consider all the overloads for operations provided by std::basic_string.
Don't understand what you mean. The String is just the internal storage type in the path, similar to char/wchar for basic_string. basic_string doesn't have an interface using the internal storage except c-strings "const char*". I think the path interface should always have a basic_string interface regardless of the internal storage type. One solution could be to have a second template argument which specifies the interface type. template <class StorageStringT, class InterfaceStringT = basic_string<typename StorageStringT::value_type> > class path { path(const InterfaceStringT& str) { append(str.begin(), str.end()); } InterfaceStringT file_string() const { ... } const StorageStringT& string() const { return m_path; } ... };
Anyhow, the consistent (and sensible) set for path would be:
const path & const string & const char * InputIterator, InputIterator
The last one could be confusing since on a path you iterate over path elements and not characters. string s("/abc/def"); path p1(s.begin(), s.end()); path p2(p1.begin(), p1.end()); // should this work?