Вот шаги, которые происходят внутри для обоих вызовов:
(Подсказка: единственное отличие заключается в шаге 3)
new Test()
:
new Object()
obj obj.__proto__
в Test.prototype
return Test.call(obj) || obj;
// normally obj is returned but constructors in JS can return a value
Object.create( Test.prototype )
new Object()
obj obj.__proto__
в Test.prototype
return obj;
Так в основном Object.create
не выполняет конструктор.
Если вы хотите сделать это во время компиляции, вы наверняка можете сделать что-то вроде
#ifdef WIN32
#define OS_SEP '\\'
#else
#define OS_SEP '/'
#endif
Или вы можете просто использовать '/', и все будет отлично работать в Windows (за исключением старых программ, которые проанализируйте строку и работайте только с '\'). Это выглядит смешно, только если отображается для пользователя таким образом.
Как это часто бывает, у Boost есть библиотека, которая делает то, что вы хотите. Здесь руководство.
Используйте '/' внутри везде. Затем напишите набор служебных функций, которые импортируют путь любой формы с помощью '/'. Напишите функцию «собственный путь», которая имеет специфичные для системы ifdef и необходимые преобразования. который может быть вызван по запросу.
Один из простых способов сделать то, о чем вы просили, - создать небольшую (возможно, встроенную) функцию, которая использует магию препроцессора для определения платформы ( #ifdef WIN32
и т. Д.) и возвращает соответствующий символ-разделитель.
Ответ немного сложнее, потому что есть другие более существенные различия, чем символ-разделитель. Файловые системы Windows могут иметь несколько корней (C: \, D: \ и т. Д.), В то время как вся FS имеет корень в / в Unix-land.
Лучшим советом может быть использование boost :: filesystem
.