Boost.Fusion определяет член массива структуры

Как ты делаешь это?

using char10 = char[10];
BOOST_FUSION_DEFINE_STRUCT(
(demo), employee,
(char10, name))

не работает:
main.cpp: 8: 1: ошибка: несовместимые типы при присвоении ‘boost :: call_traits :: param_type {aka const char * const}’ для ‘char10 {aka char [10]}’

using char10 = char[10];
BOOST_FUSION_DEFINE_STRUCT(
(demo), employee,
(decltype(char10{}), name))

тоже не работает:
main.cpp: 8: 1: ошибка: инициализация значения ссылочного типа ‘char (&) [10]

1

Решение

Это невозможно для массивов в стиле C из-за печально известного свойства распада массива в указатель, которое имеет C (и все еще связывает C ++ для обратной совместимости).

Это ломается, так как макрос Fusion генерирует такой код:

namespace demo {
struct employee {
typedef employee self_type;
char10 name;
employee() : name() {}
employee(self_type const &) = default;
employee(self_type &&) = default;
template <typename Seq>
employee(Seq const &seq, typename boost::disable_if<boost::is_convertible<Seq const &, char10> >::type * = 0)
: name(boost::fusion::deref(boost::fusion::advance_c<0>(boost::fusion::begin(seq)))) {}
self_type &operator=(self_type const &) = default;
self_type &operator=(self_type &&) = default;
template <typename Seq> self_type &operator=(Seq const &seq) {
typedef typename boost::fusion::result_of::begin<Seq const>::type I0;
I0 i0 = boost::fusion::begin(seq);
name = boost::fusion::deref(i0);
return *this;
}
explicit employee(boost::call_traits<char10>::param_type arg) : name(arg) {}
};
} // namespace demo

В списке инициализатора конструктора:

explicit employee(boost::call_traits<char10>::param_type arg) : name(arg) {}

тип arg будет char const* который не является допустимым инициализатором для строки ( char const(&)[10] было бы, но нужно

Решение

Пройдите путь C ++:

Жить на Колиру (C ++ 11)

#include <boost/fusion/include/define_struct.hpp>

using char10 = std::array<char, 10>;

BOOST_FUSION_DEFINE_STRUCT(
(demo), employee,
(char10, name))

#include <boost/core/demangle.hpp>
#include <iostream>
int main() {
demo::employee emp;
emp.name = {{'I',' ','a','m',' ','G','r','o','o','t'}};
}

Если вы застряли в темных веках, вы можете использовать boost::array вместо:

Жить на Колиру (C ++ 03)

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]