- 主题:求助json.hpp代码
请问在调用 to_json() 时,怎么保证 ** 处的 to_json() 不是 ## 处的常对象,
从而避免无限递归调用?
是decltype做到的吗?
namespace detail {
struct to_json_fn{
template<typename BasicJsonType, typename T>
auto operator()(BasicJsonType& j, T&& val) const
noexcept(noexcept(to_json(j, std::forward<T>(val))))
-> decltype(to_json(j, std::forward<T>(val)), void())
{
return to_json(j, std::forward<T>(val)); // **
}
};
} // namespace detail/
// namespace to hold default `to_json` function
namespace{
// 相当于定义了一个常对象
// ##
constexpr const auto& to_json = detail::static_const<detail::to_json_fn>::value;} // namespace
--
FROM 115.156.208.*
【 在 jacksongze 的大作中提到: 】
: 请问在调用 to_json() 时,怎么保证 ** 处的 to_json() 不是 ## 处的常对象,
: 从而避免无限递归调用?
: 是decltype做到的吗?
: ...................
好奇,to_json()怎么做的?自己写吗?
--
FROM 221.221.53.*
namespace YourSpace{
void to_json(json& , YourClass& );
class YourClass;
}
调用
json j; YourSpace::YourClass y;
to_json(j,y);
机制 我猜测
通过 ADL means Argument-Dependent Lookup 可以保证找到 YourSpace::YourClass
::nlohmann::to_json()是显示调用的,
最后到 to_json_fn 里面,通过模板的机制,已定义的函数 就不用 模板了。
最后这个没写成过,我不懂。
【 在 ylh1969 (没谱) 的大作中提到: 】
: 好奇,to_json()怎么做的?自己写吗?
--
FROM 171.113.242.*
【 在 jacksongze 的大作中提到: 】
: namespace YourSpace{
: void to_json(json& , YourClass& );
: class YourClass;
: ...................
做过,需要模板。没看见它模板在哪里。JAVA可以通过反射取得模板。
--
修改:ylh1969 FROM 221.221.53.*
FROM 221.221.53.*