函数根据输入返回不同的类型

时间:2016-05-03 09:39:01

标签: c++ c++11 templates auto

我想编写一个函数,它会根据某些条件返回StringIntFloat。使用C11。尝试了几个已经提到的东西,不能使用template / auto。如果该函数只有一个返回,则此时它的罚款。当我添加另一个返回say字符串时,编译错误。错误:从intchar*

的转换无效
template<typename T>
T getProperty(int field,Json::Value root)
{
  for(int i =0;i < root["properties"].size(); i++)
  {
    if(root["properties"][i]["field"].asInt() == field)
    {
      if(strcmp(root["properties"][i]["type"].asString().c_str(),"int") == 0)
      {
      T convertedValue = (root["properties"][i]["currVal"].asInt());
        return  convertedValue;
      }


      if(strcmp(root["properties"][i]["type"].asString().c_str(),"string") == 0)
      {
      T convertedValue;
      sprintf(convertedValue,"%s",root["properties"][i]["currVal"].asString().c_str());
        return convertedValue;
      }
    }
  }
}

3 个答案:

答案 0 :(得分:0)

如果你正在使用C ++ 14,这个简单的例子可以正常工作

template <typename T>
auto test(T a){
    return a;
}

int main()
{
    int a = 1;
    std::cout << test(a) << std::endl;
    double b = 2.0;
    std::cout << test(b) << std::endl;
    std::string s {"ss"};
    std::cout << test(s) << std::endl;
}

当然,您需要知道在通话之前要检索的类型,这可能不是您想要实现的目标

答案 1 :(得分:0)

您可以使用boost::variant<string, float, int> / boost::any作为返回类型。

请注意,这些类是C ++ 17标准库的一部分。

答案 2 :(得分:0)

您可以通过完全专门化模板来实现。但你可能应该通过返回值找到正确的field

您不必抛出这些异常,但如果不这样做,则在错误路径上,您的程序具有未定义的行为。

Json::Value getField(int field,Json::Value root)
{
    auto it = std::find_if(root["properties"].begin(), root["properties"].end(),
        [field](Json::Value item){ return item["field"].toInt() == field }); 
    if (it = root["properties"].end())
    { throw std::runtime_error("missing field"); }
    return *it;
}

// Primary template defined but not declared
template<typename T> T getProperty(int field,Json::Value root);

template<> int getProperty(int field,Json::Value root)
{
    Json::Value value = getField(field, root);
    if (value["type"].asString() == "int") 
    { throw std::runtime_error("not an int"); }
    return value["currVal"].asInt();
}

template<> std::string getProperty(int field,Json::Value root)
{
    Json::Value value = getField(field, root);
    if (value["type"].asString() == "string") 
    { throw std::runtime_error("not a string"); }
    return value["currVal"].asString();
}

// etc