Приведение константного числа к нужному типу в точке использ
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 08.10.19 07:08
Оценка: 7 (2)
Visual Studio (2013-2019).

Сражаюсь с предупреждениями 4-го уровня.

Пример
int main()
{
    char chs[10];

    std::fill(std::begin(chs),std::end(chs),0);

    std::cout << "Hello World!\n";

    return 0;
}

Компилятор выдает предупреждение для нуля, передаваемого в std::fill:
1>C:\VS-BLA-BLA\include\xutility(2253,24): warning C4244:  '=': conversion from 'const _Ty' to '_Ty', possible loss of data
1>C:\VS-BLA-BLA\include\xutility(2253,24): warning C4244:         with
1>C:\VS-BLA-BLA\include\xutility(2253,24): warning C4244:         [
1>C:\VS-BLA-BLA\include\xutility(2253,24): warning C4244:             _Ty=int
1>C:\VS-BLA-BLA\include\xutility(2253,24): warning C4244:         ]
1>C:\VS-BLA-BLA\include\xutility(2253,24): warning C4244:         and
1>C:\VS-BLA-BLA\include\xutility(2253,24): warning C4244:         [
1>C:\VS-BLA-BLA\include\xutility(2253,24): warning C4244:             _Ty=char
1>C:\VS-BLA-BLA\include\xutility(2253,24): warning C4244:         ]
1>D:\MY-BLA-BLA\ConsoleApplication1\ConsoleApplication1.cpp(10): message :  see reference to function template instantiation 'void std::fill<_Ty*,int>(const _FwdIt,const _FwdIt,const int &)' being compiled
1>D:\MY-BLA-BLA\ConsoleApplication1\ConsoleApplication1.cpp(10): message :         with
1>D:\MY-BLA-BLA\ConsoleApplication1\ConsoleApplication1.cpp(10): message :         [
1>D:\MY-BLA-BLA\ConsoleApplication1\ConsoleApplication1.cpp(10): message :             _Ty=char,
1>D:\MY-BLA-BLA\ConsoleApplication1\ConsoleApplication1.cpp(10): message :             _FwdIt=char *
1>D:\MY-BLA-BLA\ConsoleApplication1\ConsoleApplication1.cpp(10): message :         ]

Я не хочу заморачиваться с приведением нуля к нужному типу (char, в данном случае).

  Поэтому, для устранения предупреждения, применяю такую штуку:
namespace structure{

template<int initializeValue>
class t_numeric_initializator
{
 public:
  t_numeric_initializator()
  {
  }

  operator char             () const        {return static_cast<char>            (initializeValue);}
  operator wchar_t          () const        {return static_cast<wchar_t>         (initializeValue);}

  operator unsigned char    () const        {return static_cast<unsigned char>   (initializeValue);}
  operator unsigned short   () const        {return static_cast<unsigned short>  (initializeValue);}
  operator unsigned int     () const        {return static_cast<unsigned int>    (initializeValue);}
  operator unsigned __int64 () const        {return static_cast<unsigned __int64>(initializeValue);}

  operator signed char      () const        {return static_cast<signed char>     (initializeValue);}
  operator signed short     () const        {return static_cast<signed short>    (initializeValue);}
  operator signed int       () const        {return static_cast<signed int>      (initializeValue);}
  operator signed __int64   () const        {return static_cast<signed __int64>  (initializeValue);}

  operator signed long      () const        {return static_cast<signed long>   (initializeValue);}
  operator unsigned long    () const        {return static_cast<unsigned long> (initializeValue);}

  operator float            () const        {return static_cast<float>  (initializeValue);}
  operator double           () const        {return static_cast<double> (initializeValue);}
};//class t_numeric_initializator

static t_numeric_initializator<0> zero;

}//namespace structure;

Используется так:
int main()
{
    char chs[10];

    std::fill(std::begin(chs),std::end(chs),structure::zero);

    std::cout << "Hello World!\n";

    return 0;
}

Все, предупреждений нет.

Вопрос — это нормальный велосипед? Или есть решения получше?

---
PS. У меня есть еще "t_numeric_initializator<-1> negative_one" для схожих проблем с -1.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Отредактировано 08.10.2019 7:26 Коваленко Дмитрий . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.