Определить типобезопасность 0 с помощью функции шаблона - PullRequest
0 голосов
/ 03 ноября 2018

Я занимаюсь разработкой проекта с использованием C ++ 98. Так что у меня нет "nullptr". Конечно, я делаю статический анализ кода для исходного кода в моем проекте. От этого я получил много сообщений об использовании 0 в назначениях и сравнениях. Все сообщения относятся к «разным типам». Я начал добавлять суффиксы к 0, чтобы определить некоторые правильные типы. Но это возможно не для всех типов данных. И особенно не для указателей (да, необработанный указатель).

Я тогда придумал следующий шаблон:

template <typename T>
const T null(void) 
{
    return static_cast<T>(0);
}

С этим я больше не получаю предупреждений относительно смешивания типов. Я могу написать, например:

typedef unsigned char uchar;
. . . 
uchar someVariable = null<uchar>();
SomeComplexClass *someComplexClass = null<SomeComplexClass *>();
. . . 
if (null<SomeComplexClass *>() == someComplexClass)
{
    . . . 
}

Вы можете спросить, боже мой, что это за ерунда. Но, будучи экспертом по функциональной безопасности и работая в автомобильной промышленности, я получаю все больше и больше предостережений, даже в небольших домашних проектах для хобби, таких как описанные выше.

После прочтения Скотта Мейерса "Эффективно Современный C ++ ", особенно" Пункт 1: Понимание типа шаблона. " в объектном коде просто 0. Но

  • Синтаксис всегда будет в порядке?
  • Для какого типа?
  • А как насчет константности?
  • Любое другое решение?

У меня даже есть сомнения по поводу "nullptr". Я думаю, что я становлюсь немного параноиком: -)

...