gpt4 book ai didi

c++ - 避免在用户定义的模板特化中重复

转载 作者:行者123 更新时间:2023-11-30 02:53:18 24 4
gpt4 key购买 nike

我正在创建 a library包装 JsonCpp允许用户编写模板特化来定义来自Json::Value的转换至 T来自 TJson::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> )

我能想到的使这个更简洁、更优雅的唯一方法是使用宏,但我可能可以在不使用预处理器的情况下做一些事情。想法?

最佳答案

对于 ToJson 方向,您根本不需要模板 - 在输入类型上重载一个自由函数就足够了:

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;
}

关于c++ - 避免在用户定义的模板特化中重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18130067/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com