我正在尝试学习可变参数模板和函数.我无法理解为什么这段代码不能编译:
template<typename T>
static void bar(T t) {}
template<typename... Args>
static void foo2(Args... args)
{
(bar(args)...);
}
int main()
{
foo2(1, 2, 3, "3");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我编译它失败时出现错误:
错误C3520:'args':必须在此上下文中扩展参数包
(在功能上foo2).
我想创建一个包含我的类的实例变量的JSON字符串.
例如,
class Example {
std::string string;
std::map<std::string, std:string> map;
std::vector<int> vector;
};
Run Code Online (Sandbox Code Playgroud)
会成为:
{
"string":"the-string-value",
"map": {
"key1":"val1",
"key2":"val2"
},
"vector":[1,2,3,4]
}
Run Code Online (Sandbox Code Playgroud)
我已经研究了几个用于创建JSON的C++库,它们看起来都非常复杂.我想要类似于Javascript的东西JSON.stringify(object).换句话说,只需将std :: map传递给它并接收一个字符串.地图可以包含其他地图,矢量,列表,字符串,数字和布尔.
最好的方法是什么?
谢谢你的帮助.
编辑
我调查了以下内容:
json spirit,jsoncpp,zoolib,JOST,CAJUN,libjson,nosjob,JsonBox,jsonme--
据我所知,我可以构建一个单独的JSON对象,如下面的答案和转换为JSON我希望能够将我的东西存储在标准集合中并进行转换.
编辑2
好吧,废弃了序列化类的想法,因为看起来C++缺乏反射是不可能的.
有没有一种很好的方法将包含std:maps,std :: vectors,std :: lists,numbers,strings和bools的std :: map转换为JSON,而无需更改数据类型或将数据复制到新的数据类型?
谢谢.
我正在尝试实现一个"属性"系统来将C++实例转换为JSON,反之亦然.我在这个问题(C++ JSON序列化)中从Guillaume Racicot的答案中获取了部分代码并对其进行了简化.
以下是我的进展方式.我有一Property节课:
template <typename Class, typename T>
struct Property {
constexpr Property(T Class::* member, const char* name) : m_member(member), m_name(name) {}
T Class::* m_member;
const char* m_name;
};
Run Code Online (Sandbox Code Playgroud)
m_member指向特定成员 Class
假设我想为User类定义属性,我希望能够像这样继续,以便能够为成员分配属性名称:
class User
{
public:
int age;
constexpr static auto properties = std::make_tuple(
Property<User, int>(&User::age, "age")
);
}
Run Code Online (Sandbox Code Playgroud)
此代码在GCC(http://coliru.stacked-crooked.com/a/276ac099068579fd)中编译并正常工作,但在Visual Studio 2015 Update 3中没有.我收到了以下错误:
main.cpp(19) : error C2327 : 'User::age' : is not a type name, static, or enumerator
main.cpp(19) : …Run Code Online (Sandbox Code Playgroud) 我最近发现C++中存在.*运算符(以及密切相关的->*运算符).(见这个问题.)
起初看起来很整洁,但为什么我会需要这样的东西呢?链接问题中的两个答案提供了可以从直接函数调用中受益的人为例子.
在直接函数调用不方便的情况下,可以使用函数对象,就像可以使用的lambda函数一样std::sort.这消除了间接级别,因此比使用更高效.*.
链接的问题还提到了此示例的简化版本:
struct A {
int a;
int b;
};
void set_member(A& obj, int A::* ptr, int val){
obj.*ptr = val;
}
int main()
{
A obj;
set_member(obj, &A::b, 5);
set_member(obj, &A::a, 7);
// Both members of obj are now assigned
}
Run Code Online (Sandbox Code Playgroud)
但这样做是非常微不足道的(可能更好的做法,因为它更清洁,并且不会对成员造成不必要的限制A):
struct A {
int a;
int b;
};
void set_me(int& out, int val){
out = val;
}
int main()
{
A obj;
set_me(obj.b, …Run Code Online (Sandbox Code Playgroud) 我从我的服务器下载json.我从服务器发送的对象是C#对象,如下所示:
public class User
{
public string UserName { get; set; }
public string Info { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在,我必须在我的C++应用程序中获取此数据.我使用这个库.
我从服务器获得的对象是这样的类型: web::json::value
如何从中获取UserName web::json::value?
我有一个结构:
typedef struct Tick {
double open;
double high;
double low;
double close;
double ema100;
} Tick;
Run Code Online (Sandbox Code Playgroud)
我想访问一个给定键的属性:
Tick currentTick = {44.5, 45.1, 44.2, 44.6, 44.255};
std::string key = "ema100";
std::cout << currentTick[key];
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点而不使用std::map?我想答案是否定的,但是我只想确定在修改所有要使用的内容std::map并增加内存需求之前。