Не знаете, что вы хотите ...
Если 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
}
Вам нужно реализовать UnmarshalText
вместо UnmarshalJSON
. Из документации :
Значения карты кодируются как объекты JSON. Тип ключа карты должен быть либо строкой, целочисленным типом, либо реализовывать encoding.TextMarshaler.
blockquote>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 }