как вы читаете уникальный идентификатор тега NFC на android?

Tag myTag = (Tag) intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Log.i("tag ID", myTag.getId().toString());

Это дает мне идентификатор типа "[ B @ 40521c40Я хочу, чтобы правила парсера и генератора для моих типов были унифицированы в варианте. существует неопределенный тип, тип int4 (см. ниже) и тип int8. Вариант читается как вариант .

int4 traits:

struct rbl_int4_parser_rule_definition
{
  typedef boost::spirit::qi::rule<std::string::iterator, rbl_int4()> rule_type;

  boost::spirit::qi::int_parser<rbl_int4> parser_int32_t;

  rule_type rule;

  rbl_int4_parser_rule_definition()
  {
    rule.name("rbl int4 rule");
    rule = parser_int32_t;  
  }
};

template<>
struct rbl_type_parser_rule<rbl_int4>
{
  typedef rbl_int4_parser_rule_definition string_parser;
};

вариант выше начинается как undefined, а затем я инициализирую правила. У меня была проблема, которая вызвала 50 страниц ошибок, и мне наконец удалось ее отследить. Вариант использует operator = во время присваивания и boost :: spirit :: qi :: int_parser < > не может быть назначено другому (operator =).

Для сравнения, у меня нет проблемы с моим неопределенным типом:

struct rbl_undefined_parser_rule_definition
{
  typedef boost::spirit::qi::rule<std::string::iterator, void()> rule_type;
  rule_type rule;

  rbl_undefined_parser_rule_definition()
  {
    rule.name("undefined parse rule");
    rule = boost::spirit::qi::eps;
  }
};

template<>
struct rbl_type_parser_rule<rbl_undefined>
{
  typedef rbl_undefined_parser_rule_definition string_parser;
};

Концентрация проблемы:

#include <string>
#include <boost/spirit/include/qi.hpp>
#include <boost/variant.hpp>
#include <boost/cstdint.hpp>

typedef boost::spirit::qi::rule<std::string::iterator,void()> r1;
typedef boost::spirit::qi::rule<std::string::iterator,int()> r2;

typedef boost::variant<r1,r2> v;

int main()
{
  /*
  problematic
  boost::spirit::qi::int_parser<int32_t> t2;
  boost::spirit::qi::int_parser<int32_t> t1;


  t1 = t2;
  */

  //unproblematic
  r1 r1_;
  r2 r2_;
  r1_ = r2_;

  v v_;
  // THIS is what I need to do.
  v_ = r2();
}

Существует семантический разрыв между конкретными парсеры и правила. Мой мозг сейчас курит, поэтому я не собираюсь думать о праматизме, Мой вопрос: как мне решить эту проблему? Я могу придумать три подхода к решению проблемы.

один: Статические функции-члены:

struct rbl_int4_parser_rule_definition
{
  typedef boost::spirit::qi::rule<std::string::iterator, rbl_int4()> rule_type;

  //boost::spirit::qi::int_parser<rbl_int4> parser_int32_t;

  rule_type rule;

  rbl_int4_parser_rule_definition()
  {
    static boost::spirit::qi::int_parser<rbl_int4> parser_int32_t;

    rule.name("rbl int4 rule");
    rule = parser_int32_t;  
  }
};

Я думаю, что первый подход предотвращает потокобезопасность код? ?

два: Интегральный синтаксический анализатор заключен в shared_ptr. Есть две причины, по которым я возился с TMP для системы набора текста: 1 эффективность, 2 централизация задач по компонентам. использование указателей устраняет первую причину.

три: operator = определяется как бездействие. вариант гарантирует, что lhs создается по умолчанию перед назначением.

Изменить: Интегральный синтаксический анализатор заключен в shared_ptr. Есть две причины, по которым я возился с TMP для системы набора текста: 1 эффективность, 2 централизация задач по компонентам. использование указателей устраняет первую причину.

три: operator = определяется как бездействие. вариант гарантирует, что lhs создается по умолчанию перед назначением.

Изменить: Интегральный синтаксический анализатор заключен в shared_ptr. Есть две причины, по которым я возился с TMP для системы набора текста: 1 эффективность, 2 централизация задач по компонентам. использование указателей устраняет первую причину.

три: operator = определяется как бездействие. вариант гарантирует, что lhs создается по умолчанию перед назначением.

Изменить: Я думаю, что вариант 3 имеет наибольший смысл (оператор = не работает). После того, как контейнер правил создан, он не изменится, и я только назначаю для принудительного включения свойства правила типа в его смещение.

80
задан Denees 24 January 2012 в 12:52
поделиться