Re[3]: extern const auto declaration
От: VTT http://vtt.to
Дата: 25.09.15 12:34
Оценка: 4 (1)
Здравствуйте, B0FEE664, Вы писали:

BFE>Длина массива определяется числом байт, а не наоборот.

BFE>assert(IsValidCommand(arr)) тем не просто так стоит

раз так, то наверное имеет смысл передавать байты и проводить валидацию в compile time:

namespace AAAPops
{
  const t_Command<'\x33', '\x70', '\x30', '\x31', '\x55'>::type COMMAND_70;
}


где t_Command — это шаблонный класс, который наследует от того же ::boost::array нужной размерности, и сам инициализирует массив переданными в шаблоне параметрами, проверяя их на валидность
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re: extern const auto declaration
От: VTT http://vtt.to
Дата: 25.09.15 11:48
Оценка: 2 (1)
Здравствуйте, B0FEE664, Вы писали:

BFE>от константы 6 удалось избавится


А вот и нет. Просто раньше она у вас задавалась в явном виде, а теперь — в неявном, в виде количества параметров в функцию инициализации.
Я бы даже назвал это шагом назад, так как если кто-то передаст туда 5 параметров, то теперь ошибки не будет.

Мне проблема видится в повальной копипасте boost::array<char, 6>. Сделайте один using и будет вам счастье.

И вообще зачем городить такой былинный шаблон для инициализации массива из 6 char? А еще потом люди удивляются, что C++ считают излишне сложным.
KISS
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Отредактировано 25.09.2015 11:51 VTT . Предыдущая версия . Еще …
Отредактировано 25.09.2015 11:51 VTT . Предыдущая версия .
Отредактировано 25.09.2015 11:50 VTT . Предыдущая версия .
extern const auto declaration
От: B0FEE664  
Дата: 25.09.15 11:04
Оценка:
Вот раньше я делал так:

// 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;
компилятор ругается.
И каждый день — без права на ошибку...
Re[2]: extern const auto declaration
От: B0FEE664  
Дата: 25.09.15 12:05
Оценка:
Здравствуйте, VTT, Вы писали:

BFE>>от константы 6 удалось избавится

VTT>А вот и нет. Просто раньше она у вас задавалась в явном виде, а теперь — в неявном, в виде количества параметров в функцию инициализации.
VTT>Я бы даже назвал это шагом назад, так как если кто-то передаст туда 5 параметров, то теперь ошибки не будет.
Длина массива определяется числом байт, а не наоборот.
К тому же assert(IsValidCommand(arr)) тем не просто так стоит.

VTT>Мне проблема видится в повальной копипасте boost::array<char, 6>. Сделайте один using и будет вам счастье.

using чего надо сделать?

VTT>И вообще зачем городить такой былинный шаблон для инициализации массива из 6 char?


Для того, чтобы избежать ошибки вида:
std::array<char, 6> arr = {'\x33', '\x70', '\x30', '\x31', '\x55'};
И каждый день — без права на ошибку...
Re[4]: extern const auto declaration
От: B0FEE664  
Дата: 25.09.15 12:45
Оценка:
Здравствуйте, VTT, Вы писали:

VTT>раз так, то наверное имеет смысл передавать байты и проводить валидацию в compile time:

VTT>
VTT>namespace AAAPops
VTT>{
VTT>  const t_Command<'\x33', '\x70', '\x30', '\x31', '\x55'>::type COMMAND_70;
VTT>}
VTT>


Эта идея мне в голову не приходила. Спасибо.

PS
получилось это:

#include <array>
#include <iostream>

template<char ... args>
struct Command : public std::array<char, sizeof...( args )>
{
    Command() : std::array<char, sizeof...( args )>({args...})
    {
    }
};
     

extern const Command<'a', 's', 'd', 'f'> CMD;

const Command<'a', 's', 'd', 'f'> CMD{};

int main(int argc, char* argv[])
{
    for(auto ch : CMD)
      std::cout << ch << std::endl;

    return 0;
}
И каждый день — без права на ошибку...
Отредактировано 25.09.2015 13:19 B0FEE664 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.