当前位置: 首页 > 知识库问答 >
问题:

如何用C++(11)中的模板填充json中尽可能通用的std::vector?

贺浩漫
2023-03-14

我将数据保存为一个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")

共有1个答案

夏建木
2023-03-14

不看大局很难回答你的问题。您的问题可能在于您的设计,但我将首先解释为什么您当前的方法不起作用。

这里的问题是,您试图在知道模板方法应该返回的类型之前使用它。最终发生的是,您得到一个返回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