Я працював добре, підтримуючи рівень сумісності вперед та назад у своїх програмах на C ++, поки в кінцевому підсумку мені не довелося зробити з нього бібліотечний інструментарій , який я готую до випуску , вже вийшов. Загалом, доки ви приймете, що ви не отримаєте "ідеальної" сумісності форвардів ні в функціях (деякі речі просто неможливо перепрограмувати вперед), ні в синтаксисі (можливо, вам доведеться використовувати макроси, альтернативні простори імен для деякі речі) то ви все налаштовані.
Існує велика кількість функцій, які можна наслідувати в C ++ 03 на рівні, достатньому для практичного використання - і без усіх клопотів, які виникають, наприклад: Boost. Чорт забирає, навіть пропозиція стандартів C ++ nullptr
пропонує підказку C ++ 03. А потім є TR1, наприклад, для всього C ++ 11, але - у нас були попередні перегляди - протягом років. Мало того, деякі функції C ++ 14, такі як варіанти затвердження, прозорі функтори, і optional
можуть бути реалізовані в C ++ 03!
Єдині дві речі, які я знаю, що їх неможливо повністю підтримати - це шаблони конвекстра та варіативні.
Що стосується всього питання додавання матеріалів до простору імен std
, я вважаю, що це зовсім не має значення . Подумайте про Boost, одну з найважливіших і найбільш релевантних бібліотек C ++ та їх реалізацію TR1: Boost.Tr1. Якщо ви хочете вдосконалити C ++, зробіть його вперед сумісним із C ++ 11, то, за визначенням, ви перетворюєте його на щось, що не є C ++ 03, тому блокування себе за Стандартом, якого ви хочете уникнути або залишити позаду так чи інакше , просто кажучи, контрпродуктивний. Пуристи будуть скаржитися, але за визначенням їх не потрібно дбати.
Звичайно, саме тому, що ви не будете дотримуватися стандарту (03), це ще не означає, що ви не можете намагатися, або будете радісно обіймати його. Це не суть. Поки ви будете дуже ретельно контролювати те, що додано в std
простір імен, і контролювати середовища, де використовується ваше програмне забезпечення (тобто: робіть тестування!), Взагалі не повинно бути ніякої непереборної шкоди. Якщо можливо, визначте все в окремому просторі імен і додайте лише using
директиви до простору імен, std
щоб ви нічого не додавали там, крім того, що потрібно "абсолютно". Що, IINM, є більш-менш тим, що робить Boost.TR1.
Оновлення (2013) : як запит на оригінальне запитання та побачивши деякі коментарі, до яких я не можу додати через відсутність повторень, ось список функцій C ++ 11 та C ++ 14 та ступінь їх переносимості до C ++ 03:
nullptr
: повністю реалізована з огляду на офіційний Комітет; Вам, мабуть, доведеться також надати деякі спеціалізації type_traits, щоб вони були визнані "рідним" типом.
forward_list
: повністю реалізована, хоча підтримка розподільника покладається на те, що може надати ваше ім'я Tr1.
- Нові алгоритми (partition_copy тощо): повністю реалізовані.
- Конструкції контейнерів з дужок-послідовностей (напр . :)
vector<int> v = {1, 2, 3, 4};
: повністю реалізовані, хоч і важчіші, ніж хотілося б.
static_assert
: майже повністю реалізований, коли реалізований як макрос (обережним буде лише комами).
unique_ptr
: майже повністю реалізований, але вам також потрібна підтримка коду виклику (для зберігання їх у контейнерах тощо); див. нижче, хоча.
- rvalue-reference: майже повністю реалізовані залежно від того, скільки ви очікуєте отримати від них (наприклад: Boost Move).
- Попереджуйте ітерацію: майже повністю реалізований синтаксис дещо відрізнятиметься.
- використання локальних функцій в якості аргументів (наприклад: перетворення): майже повністю реалізований, але синтаксис буде досить різним - наприклад, локальні функції не визначені на сайті виклику, а прямо раніше.
- явні оператори перетворення: реалізовані на практичних рівнях (отримання конверсії робиться явною), див. " Явний_випуск" + " Недосконалий C ++ "; але інтеграція з мовними функціями, такими як,
static_cast<>
можливо, майже неможлива.
- переадресація аргументів: можлива реалізація на практичних рівнях, з огляду на вищезазначене на rvalue-посиланнях, але вам потрібно буде забезпечити N перевантажень для ваших функцій, приймаючи аргументи, що не підлягають зміні.
- переміщення: реалізовується на практичних рівнях (див. дві підказки). Звичайно, вам доведеться використовувати контейнери-модифікатори та об'єкти, щоб отримати з цього прибуток.
- Розподілені алокатори: Не реально реалізується, якщо ваша реалізація Tr1 може допомогти в цьому.
- багатобайтові типи символів: Не реально реалізовано, якщо ваш Tr1 може підтримати вас. Але за призначенням краще покластися на бібліотеку, спеціально розроблену для вирішення цього питання, наприклад, ICU, навіть якщо використовується C ++ 11.
- Переліки різноманітних аргументів: реалізовані з певними клопотами, зверніть увагу на переадресацію аргументів.
noexcept
: залежить від особливостей вашого компілятора.
- Нова
auto
семантика і decltype
: залежить від особливостей вашого компілятора - напр .: __typeof__
.
- цілі типи розміру (
int16_t
тощо): залежать від особливостей вашого компілятора - або ви можете делегувати портативний stdint.h.
- атрибути типу: залежать від особливостей вашого компілятора.
- Список ініціалізаторів: Наскільки мені невідомо; однак якщо ви хочете ініціалізувати контейнери з послідовностями, дивіться вище про "конструкції контейнерів".
- Надання псевдоніму шаблонів: Наскільки мені не відомо, але це все-таки непотрібна функція, і ми маємо
::type
в шаблонах назавжди
- Варіантні шаблони: Наскільки мені невідомо; тісно - аргумент шаблону за замовчуванням, який вимагає N спеціалізацій тощо.
constexpr
: Наскільки мені невідомо.
- Уніфікована ініціалізація: наскільки мені не відомо, але гарантована за замовчуванням ініціалізація конструктора може бути реалізована ala Boost, ініціалізована значенням.
- C ++ 14
dynarray
: повністю реалізований.
- C ++ 14
optional<>
: майже повністю реалізований, якщо ваш компілятор C ++ 03 підтримує налаштування вирівнювання.
- C ++ 14 прозорих функторів: майже повністю реалізований, але ваш клієнтський код, ймовірно, повинен явно використовувати, наприклад:
std::less<void>
для того, щоб він працював.
- C ++ 14 нових варіантів затвердження (таких як
assure
): повністю реалізований, якщо ви хочете стверджувати, майже повністю реалізований, якщо ви хочете замість цього включити кидки.
- C ++ 14 розширень кортежу (отримати елемент кортежу за типом): повністю реалізований, і ви навіть можете змусити його не виконати компіляцію з точними випадками, описаними в пропозиції про функції.
(Відмова від відповідальності: кілька цих функцій реалізовані в моїй бібліотеці C ++, яку я зв'язав вище, тому я думаю, що я знаю, про що я говорю, коли кажу "повністю" або "майже повністю".)