безопасная реализация nullptr

Я хотел бы, чтобы мой код компилировался как на устаревшем C ++ (код C ++ с использованием «NULL»), так и на новом стандарте C ++ 11 (код C ++ с использованием «nullptr»)

Я использую GCC, но планирую перекомпилировать всю кодовую базу также для VS, когда я закончу самые важные вещи.

Стоит ли ожидать, что и GCC, и VS будут делать что-то вроде

#define NULL nullptr

Или лучше я сделаю это сам (используя, конечно, другое имя, где MY_LIB будет заменен моим суффиксом библиотеки)?

#ifndef nullptr
#define MY_LIB_NULL NULL
#else
#define MY_LIB_NULL nullptr
#endif

Чего я хочу добиться, так это кода, который компилируется независимо от того, были ли реализованы функции C ++ 11 или нет (и поскольку я не использую шаблоны, их очень мало).

Например, ключевые слова «переопределить» и «окончательный» уже сделаны.

MY_LIB_OVERRIDE //macro, defines to "override" if c++11 is present.
MY_LIB_FINAL    //macro, defines to "final" if c++11 is present.

Я задаю вопрос, потому что знаю, что вопрос «nullptr» немного странный, поэтому, может быть, просто делать то же, что я уже делал для переопределения и финала, неправильно. Нужны мнения об этом. Любая помощь приветствуется.

5

Решение

Вы могли бы вероятно создать «ложь» my_nullptr типа my_nullptr_t следующим образом:

const class my_nullptr_t
{
public:

/* Return 0 for any class pointer */
template<typename T>
operator T*() const
{
return 0;
}

/* Return 0 for any member pointer */
template<typename T, typename U>
operator T U::*() const
{
return 0;
}

/* Safe boolean conversion */
operator void*() const
{
return 0;
}

private:

/* Not allowed to get the address */
void operator&() const;

} my_nullptr = {};

Это работает с C ++ 03 и C ++ 11 и всегда должно быть безопасным, независимо от того, какие функции C ++ 11 реализованы. Это решение на самом деле уже обсуждалось в Эта тема что предложил версию nullptr_t основанный на Официальное предложение.

1

Другие решения

NULL макрос, который расширяется до константы нулевого указателя Это все еще работает так же, как раньше. Код, который должен работать с компиляторами не-C ++ 11, должен использовать NULL,

1

Я думаю, что следующее будет работать:

#include <cstddef>

#ifndef MY_LIB_NULL
#ifndef NULL //check for NULL
#define MY_LIB_NULL nullptr
#else
#define MY_LIB_NULL NULL ///use NULL if present
#endif
#endif

в основном я проверяю на «NULL». который является макросом и может быть проверен до тех пор, пока компилятор не будет поставлен с этим макросом (вероятно, будет), чем это допустимо при использовании макроса, когда компилятор будет предоставлять только «nullptr» и больше не будет иметь NULL, тогда используется nullptr (возможно, в далекое будущее, но, кажется, мы можем с радостью продолжать использовать NULL!)

Я думаю, что это безопаснее, чем переопределение «nullptr» (как большинство людей пытаются сделать)

0
По вопросам рекламы [email protected]