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.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --