我将数据保存为一个json文件,我想重新加载它。由于它们是json,所以加载后它们是字符串(我使用boost属性树)。我编写了一个函数来重新解释std::矢量。在我调用此函数进行编译之前,它工作得很好。则编译器不知道如何正确使用此代码:
template<typename T_vecType>
std::vector<T_vecType> getValues1D(std::string key)
{
using boost::property_tree::ptree;
// determine type
std::string type;
type = ptLoad.get(key + ".type", "d");
std::vector<std::string> out;
BOOST_FOREACH(ptree::value_type &v,
ptLoad.get_child(key + ".value" ))
{
out.push_back(v.second.data());
}
if(type == "f")
{
std::vector<T_vecType> resultf;
for (int i = 0; i < out.size(); ++i) {
resultf.push_back( std::stof( out[i].c_str() ) );
}
return resultf;
}
else if(type == "i")
{
std::vector<T_vecType> resulti;
for (int i = 0; i < out.size(); ++i) {
resulti.push_back( std::stoi( out[i].c_str() ) );
}
return resulti;
}
问题是,我需要对每个数据类型的字符串进行不同的解释。这就是为什么我用这种丑陋的方式来尝试的原因。也许我是这样叫的:
getValuesVector<int>("vecData");
编译器抱怨他不能将一个float放入int中,因为他认为他将执行第一个if语句。我也试过这个:
if( typeid(T_vecType) == typeid(float) && type == "f")
...
if( typeid(T_vecType) == typeid(int) && type == "h")
不看大局很难回答你的问题。您的问题可能在于您的设计,但我将首先解释为什么您当前的方法不起作用。
这里的问题是,您试图在知道模板方法应该返回的类型之前使用它。最终发生的是,您得到一个返回vector
的方法,该方法可能返回vector
;以及一个返回vector
的方法,该方法可能返回vector
。这就是行不通。
一个简单的解决方案是在调用您的方法之前确定类型,然后调用适当的版本:
template<typename T_vecType>
std::vector<T_vecType> getValues1D(std::string key)
{
std::vector<std::string> out;
BOOST_FOREACH(ptree::value_type &v, ptLoad.get_child(key + ".value"))
{
out.push_back(v.second.data());
}
std::vector<T_vecType> result;
for (int i = 0; i < out.size(); ++i)
{
result.push_back(std::stof(out[i].c_str()));
}
return result;
}
// Then somewhere in code
if (type == "f")
{
std::vector<float> resultf = getValues1D<float>(key);
}
else if (type == "i")
{
std::vector<int> resulti = getValues1D<int>(key);
}
这只是展示了如何使用模板,但并不一定能解决您的整体问题。实际的解决方案可能看起来更像这个问题的答案:带有模板成员变量的C++类
问题内容: 我有一个JSON请求,该请求从youtube返回一个响应,其中包含对特定视频的评论。我目前有3种文本视图:一种用于名称/上载器,一种用于内容,一种用于发布日期- 然后用我的JSON响应中的数据填充。 我的问题是-仅出现第一个评论,发布日期和上传者。 我相信我将需要用列表视图替换我的textviews并将其解析为3个字段-我只是不知道如何。 爪哇 公共类Player扩展了YouTubeB
本文向大家介绍C++11中std::future的具体使用方法,包括了C++11中std::future的具体使用方法的使用技巧和注意事项,需要的朋友参考一下 C++11中的std::future是一个模板类。std::future提供了一种用于访问异步操作结果的机制。std::future所引用的共享状态不能与任何其它异步返回的对象共享(与std::shared_future相反)( std::
在设计回调函数的时候,无可避免地会接触到可回调对象。在C++11中,提供了std::function和std::bind两个方法来对可回调对象进行统一和封装。 可调用对象 C++中有如下几种可调用对象:函数、函数指针、lambda表达式、bind对象、函数对象。其中,lambda表达式和bind对象是C++11标准中提出的(bind机制并不是新标准中首次提出,而是对旧版本中bind1st和bind
本文向大家介绍C++11 中std::promise 介绍,包括了C++11 中std::promise 介绍的使用技巧和注意事项,需要的朋友参考一下 前面两讲《C++11 并发指南二(std::thread 详解) 》,《C++11 并发指南三(std::mutex 详解) 》分别介绍了 std::thread 和 std::mutex,相信读者对 C++11 中的多线程编程有了一个最基本的认识
在C++11之前,类模板和函数模板只能含有固定数量的模板参数。C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板。可变参数模板的加入使得C++11的功能变得更加强大,而由此也带来了许多神奇的用法。 可变参数模板 可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号...: template<ty
格式 jsTree需要特定的格式才能使用JSON。在标准语法中,不需要任何字段-仅传递您需要的内容。请记住,您将能够访问您指定的任何其他属性-jsTree不会触及它们,以后您将能够使用它们(original在每个节点上使用该属性)。 要更改节点的图标,请使用icon属性。指定包含的字符串/将显示该图像作为节点图标。使用任何其他字符串将把该类<i>应用于用于表示图标的元素。您可以使用布尔值false