【问题标题】:Return different data type data in a single function C++在单个函数 C++ 中返回不同的数据类型数据
【发布时间】:2021-12-06 09:13:23
【问题描述】:

请找到下面的代码。

template<typename T>
T GetValueFromDataType(Value &value)
{
    T jsonValue;
    if (value.IsString())
    {
        assert(value.IsString());
        jsonValue = value.GetString();      //here error is showing
        return jsonValue ;
    }
    else if (value.IsInt())
    {
        assert(value.IsInt());
        jsonValue = value.GetInt();
        return jsonValue;
    }
    else if (value.IsDouble())
    {
        assert(value.IsDouble());
        jsonValue= value.GetDouble();
        return jsonValue;
    }
    else if (value.IsBool())
    {
        assert(value.IsBool());
        jsonValue = value.GetBool();
        return jsonValue;
    }
}

jsonValue 在另一个函数中返回。在那里,我将返回变量声明为 int。理想情况下,它应该采用 int 大小写。但它给出了编译错误。

错误 C2440 '=':无法从 'const char *' 转换为 'int'

有没有办法使用上面的代码或任何其他构造

【问题讨论】:

  • 代码没有多大意义,为什么你在if之后assert
  • 也许你想使用constexpr if(即便如此它很可能不是上面代码当前显示的方式)
  • 此问题显示的代码不符合 stackoverflow.com 对 minimal reproducible example 的要求。这意味着这里的任何人都不太可能最终回答这个问题。但最多只能猜测。你应该edit你的问题来展示一个最小的例子,不超过一两页代码(“最小”部分),其他人都可以剪切/粘贴、编译、运行和重现所描述的问题(“可重现”部分)完全如图所示(这包括任何辅助信息,例如程序的输入)。请参阅How to Ask 了解更多信息。
  • 它的 rapidjson 需要断言,否则会出错

标签: c++ json function templates compiler-errors


【解决方案1】:

如果您调用GetValueFromDataType&lt;int&gt;(...),那么jsonValue 内部的类型为intjsonValue = value.GetString(); 将没有任何意义。 value.IsString() 是假的,你有一个 assert 会失败并不重要。如果代码存在,则它必须是有效的 --- 除非您使用 if constexpr 明确将其排除在考虑之外。 if constexpr 的未采用分支没有被实例化,所以里面的代码只经过轻量级检查(就像在未实例化的模板中一样)。它不必是类型正确的。

不好:

assert(value.IsString());
jsonValue = value.GetString();      // this line will be fully checked
                                    // regardless of the condition above

好:

if constexpr (std::is_same_v<T, std::string>) {
   assert(value.IsString());        // make sure the value matches
   jsonValue = value.GetString();   // this line will NOT be fully checked 
                                    // if the condition in the if statement
                                    // (known at compile time) is false.
}

话虽如此,我不喜欢这种风格,如果可能的话,我更喜欢明确的专业化。

template<typename T>
T GetValueFromDataType(Value &value);

template <> 
std::string GetValueFromDataType<std::string>(Value &value) {
    assert(value.IsString());
    return value.GetString();
}
// etc

原因是它更加模块化。如果添加了新类型,我们不必触及现有功能。

【讨论】:

  • 嗨,我尝试了上面的代码,但给出了错误。一个错误是 Error C2059 语法错误:'type'
  • @TechnologyEnthusiast 修复它们。您拥有完整的代码,包括Value 的定义。我没有。
  • 谢谢你...专业化工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 2012-11-24
  • 2014-02-02
  • 1970-01-01
相关资源
最近更新 更多