Я создаю a library, который оборачивает JsonCpp позволяет пользователю писать шаблон специализаций для определения переходов из Json::Value
в T
и от T
до Json::Value
. Он работает, но синтаксис специализации очень неэлегантен, и я хотел бы улучшить его, избегая повторений.Избегайте повторения в определенном пользователе специализации шаблона
Вот как вы можете в настоящее время определить преобразование:
namespace ssvuj // my library's namespace
{
namespace Internal
{
template<> struct FromJson<sf::Color>
{
inline static sf::Color conv(const Obj& mObj)
{
return sf::Color(as<float>(mObj, 0), as<float>(mObj, 1), as<float>(mObj, 2), as<float>(mObj, 3));
}
};
template<> struct ToJson<sf::Color>
{
inline static Obj conv(const sf::Color& mValue)
{
Obj result;
set(result, 0, mValue.r);
set(result, 1, mValue.g);
set(result, 2, mValue.b);
set(result, 3, mValue.a);
return result;
}
};
}
}
// example usage
ssvuj::Obj objColor; // this Json object contains sf::Color data
ssvuj::Obj objEmpty; // this Json object is empty
sf::Color colorFromObj{ssvuj::as<sf::Color>(objColor)}; // color is initialized by "deserializing" the Json object
ssvuj::set(objEmpty, colorFromObj); // the color is "serialized" into the empty Json object
Проблемы я замечаю:
- Повторение типа,
sf::Color
в этом случае - Необходимость использования структуры специализации с
static void
(я пробовал специализированные функции, но он не работает для частичных специализаций, таких какT = std::vector<T>
)
Единственный способ, которым я могу думать о том, чтобы сделать этот менее подробный и элегантный, - это макрос, но, вероятно, я могу обойтись без использования препроцессора. Идеи?
Почему вы хотите, чтобы два типа для преобразования, а не одного типа, который предлагает функцию '' fromJson' и toJson'? В качестве альтернативы вы можете попытаться использовать перегрузки (а не специализации) для типов, которые хотите поддерживать ... Если вы одновременно включите ADL, код пользователя станет намного проще. –
где ваша структура с функцией 'static void'? – Walter
@ DavidRodríguez-dribeas: вы правы, я думаю, было бы намного лучше с помощью одной 'конвертера' struct. Я проверю это, и я дам вам знать, удовлетворен ли я этим, чтобы вы могли опубликовать ответ, который я могу принять. –