首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现与nlohmann/json类似的get<T>()?

问如何实现与nlohmann/json类似的get<T>()?
EN

Stack Overflow用户
提问于 2022-03-30 05:47:06
回答 1查看 210关注 0票数 1

我正在编写一个json库,它的用法与nlohmann/json相同。但是我很难理解nlohmann的get()函数。所以我自己实现了一个get(),但是我认为我的方法不是很好,您有什么好的解决方案或建议吗?

代码语言:javascript
复制
#include <vector>
#include <iostream>
#include <vector>
#include <string>
#include <map>

using namespace std;

bool func(bool) { return 1; }
int func(int) { return 2; }
double func(double) { return 3; }
string func(string&) { return string("4"); }
vector<int> func(vector<int>&) { return { 5 }; }
map<int, int> func(map<int, int>&) {
    map<int, int>a;
    a.emplace(6, 6);
    return a;
}

template <typename T>
T get() {
    static T t;
    return func(t);
}

int main() {
    cout << get<bool>();
    cout << get<int>();
    cout << get<double>();
    cout << get<string>();
    cout << get<vector<int>>()[0];
    cout << get<map<int, int>>()[6];
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-30 10:02:53

你的方式可行,但是

  • 需要默认的可构造类型(所以没有void、reference、.)、
  • 类型,它们什么也不做(例如,使用全局互斥的RAII对象就会有问题)。即使是日志也可能很奇怪。
  • 您应该关心具有重载解析的转换/升级(get<char>与您的类型不明确,get<void(*)()>会调用func(bool),但幸运的是,也会因为返回类型而无法编译)

作为替代办法:

  • 作为您的类型集看起来是有限且不可扩展的,

代码语言:javascript
复制
- you might used `if constexpr`:

模板T get() { if constexpr (std::is_same_v) {返回true;}std::is_same_v) {返回42;}std::is_same_v) {返回4.2;}std::is_same_v) {返回"Hello“;{std::is_same_v) {返回{4,8,15,16,23,42};}std::is_same_v>) {返回{1,2},{3,4}};} static_assert(always_false::value);}}

代码语言:javascript
复制
- or (full) specialization:

模板T get();// No impl,专门化模板<> bool (){返回真;} <> int get() {返回42;} template <> double get() {返回4.2;} template <> std::string get() {返回"Hello“;} template <> std::向量get() {返回{4,8,15,16,23,42};} <> std::map get() {返回{1,2},{3,4}};}

  • 重用了您的调度思想,但使用了一个标记。(这允许可扩展的类型集和模板实现)

模板结构标签{};bool func(标记){返回真;} int func(标记){返回42;} double func(标记){返回4.2;}std::字符串func(tag) {返回字符串(“Hello”);}std::向量func(tag) {返回{4,8,15,16,23,42};} std::map func(tag>) {返回{{1,2},{3,4}};}#如果0 //允许扩展和模板模板UserTemplateType func(tag) {返回{};} #endif模板T get() {返回函数(标签{});}

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71672091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档