Unmarshaling JSON map, где ключ не встроенного типа

Не знаете, что вы хотите ...

Если Result и Input являются типами, а не параметрами шаблона, и вы хотите, чтобы шаблон foo() получал столько Input объекты шаблона, вы можете начать с настраиваемого параметра шаблона GetFirst, чтобы выбрать первый параметр шаблона в вариационном списке

template <typename T0, typename ...>
struct GetFirst
 { using type = T0; };

и записать foo() следующим образом

template <typename ... Bars>
Result foo (typename GetFirst<Input, Bars>::type const & ... is)
 { 
   // something with is...
   return {};
 }

Итак, у вас есть

//foo<long, long long>(Input{}, Input{}, Input{}); // compilation error

foo<int, long, long long>(Input{}, Input{}, Input{}); // compiles

//foo<int, long, long long>(Input{}, Input{}); // compilation error

Если вы хотите рекурсивно управлять одиночным is..., вы можете записать foo() следующим образом

template <typename, typename ... Bars>
Result foo (Input const & i0,
            typename GetFirst<Input, Bars>::type const & ... is)
 {
   // do something with i0

   return foo<Bars...>(is...);
 }

, но вам также нужно шаблон основного фрейма foo() для прекращения рекурсии; Я предлагаю foo(), которые получают параметр нестандартного шаблона со значением по умолчанию (для перехвата Bars..., когда список пуст)

template <int = 0>
Result foo ()
 { return {}; }

Ниже приведен полный, возможно, глупый, но компилирующий пример

struct Input  { };
struct Result { };

template <typename T0, typename ...>
struct GetFirst
 { using type = T0; };

// ground case
template <int = 0>
Result foo ()
 { return {}; }

// recursive case
template <typename, typename ... Bars>
Result foo (Input const & i0,
            typename GetFirst<Input, Bars>::type const & ... is)
 {
   // do something with i0

   return foo<Bars...>(is...);
 }

int main()
 {
   //foo<long, long long>(Input{}, Input{}, Input{}); // compilation error

   foo<int, long, long long>(Input{}, Input{}, Input{}); // compiles

   //foo<int, long, long long>(Input{}, Input{}); // compilation error
 }
1
задан hlin117 18 January 2019 в 21:21
поделиться

1 ответ

Вам нужно реализовать UnmarshalText вместо UnmarshalJSON . Из документации :

Значения карты кодируются как объекты JSON. Тип ключа карты должен быть либо строкой, целочисленным типом, либо реализовывать encoding.TextMarshaler.

func (t *Tier) UnmarshalText(data []byte) error {
    switch string(data) {
    case "TIER1":
        *t = 1
    case "TIER2":
        *t = 2
    default:
        return errors.New("Unrecognized")
    }
    return nil
}

https://play.golang.org/p/6omS7ImuvRl

0
ответ дан Tim Cooper 18 January 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: