Вот раньше я делал так:
// file Commands.hpp
namespace AAAPops
{
extern const boost::array<char, 6> COMMAND_70;
}
// file Commands.cpp
namespace
{
boost::array<char, 6> CreateCommand70(.......)
{
boost::array<char, 6> arr;
....
assert(IsValidCommand(arr));
return arr;
}
}
namespace AAAPops
{
const boost::array<char, 6> COMMAND_70 = CreateCommand70(.......);
}
С переходом на новый стандарт (С++11) я подумал, что могу код существенно упростить и отказаться от явного использования некоторых магических констант, например числа 6 из приведённого выше кода.
Написал так:
// file Commands.cpp
namespace
{
template<class... A>
inline std::array<char, sizeof...( A )> CreateCommand(A&&... a)
{
std::array<char, sizeof...( A )> arr = {{ static_cast<char>( a )... }};
.....
assert(IsValidCommand(arr));
return arr;
}
}
namespace AAAPops
{
const auto COMMAND_70 = CreateCommand('\x33', '\x70', '\x30', '\x31', '\x32', '\x55');
}
И стало, вроде бы, хорошо — от константы 6 удалось избавится. Но... Но что теперь написать в Commands.hpp?
На
extern const auto COMMAND_70;
компилятор ругается.