«Backporting» nullptr в C ++ - программы до C ++ 0x

Более или менее то, что предлагает название. Хотя я еще не использую C ++ 0x , я хотел бы быть готовым к тому, когда это произойдет, и я также хотел бы уменьшить объем кода, который мне нужно переписать, чтобы использовать некоторые из его удобства. Таким образом, я могу получить обратную и прямую совместимость за один раз.

Один из самых интересных, которые я нашел, - это nullptr , который я в последнее время использую все чаще.

После проверки «Официального решения» и предложения Мейера я решил, что хочу использовать это как в моих программах на C ++, так и в будущих программах на C ++ 0x. Вторая часть проста - будучи ключевым словом, nullptr будет просто поддерживаться. Но первая часть вызывает у меня некоторый дискомфорт.

Предложение Мейерса работает следующим образом:

class nullptr_t { // ← this is my issue
    // definition of nullptr_t
} nullptr = { };

Проблема с этим предложением состоит в том, что он объявляет тип, который будет объявлен, как std :: nullptr_t , как того требует C ++ 0x. Это означает, что обходной путь «ощущается родным», должен быть выполнен путем повторного открытия пространства имен std :: для добавления типа. У меня есть понимание, что делать в программе на C ++ незаконно (в отличие от добавления специализаций , что, по-видимому, является «хмурым взглядом и отпусканием с предупреждением»).

Я хочу использовать nullptr удобным И законным способом в программе на C ++.Один из вариантов, о котором я подумал, - это объявить тип в другом пространстве имен, а затем ввести его, используя , используя :

namespace mylibrary {
class nullptr_t {
    ....
} nullptr = { };
// end namespace
}

// These would have to go in the header file.
using mylibrary::nullptr;
using mylibrary::nullptr_t; // apparently this is necessary as well?

Будет ли это правильным способом заставить его работать? Это заставит использовать директивы , что также принудительно установит определенный порядок директив #include . Правильно ли я ожидал, что никакой код до C ++ 0x не будет запрашивать тип nullptr_t с пространством имен (например, в качестве типа аргумента функции)? Будет ли это действительно работать «чувствовать себя родным», если это делается таким образом?


В качестве дополнения, приветствуется или осуждается попытка перенести некоторые изящные вещи C ++ 0x на C ++ для лучшей совместимости и кодирования? Тем временем я интегрировал это решение и другие, над которыми я работаю , в часть программного обеспечения, которое будет выпущено .

9
задан Community 23 May 2017 в 12:10
поделиться