我想编写一个函数,它会根据某些条件返回String
,Int
,Float
。使用C11。尝试了几个已经提到的东西,不能使用template / auto。如果该函数只有一个返回,则此时它的罚款。当我添加另一个返回say字符串时,编译错误。错误:从int
到char*
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;
}
}
}
}
答案 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