【发布时间】:2018-09-27 10:06:24
【问题描述】:
我有一个使用 json-glib 为 ReST 服务器创建 JSON 文件的程序。该文件有两个字段,即id 和value。 id 只是 std::string 但值可以是整数、布尔值、字符串(通过std::string od char const *)或浮点数,具体取决于要传输的值。我在c.str() 函数和char * 中遇到问题。
if(std::is_integral<T>::value)
{
if(std::is_same<T, bool>::value)
{
if(json_builder_add_boolean_value (builder, tagValue) == nullptr)
{
returnMessage = string("json_builder_add_boolean_value was inconsistent in setTag(Boolean). TagName : ") + tagName + string("TagValue : ") + to_string(tagValue);
#ifdef __DEBUG
cerr << returnMessage;
#endif
return false;
}
}
else
{
if(json_builder_add_int_value (builder, tagValue) == nullptr)
{
returnMessage = string("json_builder_add_int_value was inconsistent in setTag(Int). TagName : ") + tagName + string("TagValue : ") + to_string(tagValue);
#ifdef __DEBUG
cerr << returnMessage;
#endif
return false;
}
}
}
else if(std::is_floating_point<T>::value)
{
if(json_builder_add_double_value (builder, tagValue) == nullptr)
{
returnMessage = string("json_builder_add_double_value was inconsistent in setTag(Double). TagName : ") + tagName + string("TagValue : ") + to_string(tagValue);
#ifdef __DEBUG
cerr << returnMessage;
#endif
return false;
}
}
else if(std::is_same<T, string>::value or std::is_same<T, const string>::value)
{
if(json_builder_add_string_value (builder, tagValue.c_str()) == nullptr)
{
returnMessage = string("json_builder_add_string_value was inconsistent in setTag(String). TagName : ") + tagName + string("TagValue : ") + to_string(tagValue);
#ifdef __DEBUG
cerr << returnMessage;
#endif
return false;
}
}
else if(std::is_same<T, char *>::value or std::is_same<T, const char *>::value)
{
if(json_builder_add_string_value (builder, tagValue) == nullptr)
{
returnMessage = string("json_builder_add_string_value was inconsistent in setTag(String). TagName : ") + tagName + string("TagValue : ") + to_string(tagValue);
#ifdef __DEBUG
cerr << returnMessage;
#endif
return false;
}
}
错误:在‘tagValue’中请求成员‘c_str’,它是非类类型‘int’ if(json_builder_add_string_value (builder, tagValue.c_str()) == nullptr)
错误:从“int”到“const gchar* {aka const char*}”的无效转换 [-fpermissive]
【问题讨论】:
-
您正在寻找
if constexpr。普通的if不会丢弃死代码。 -
此解决方案从 C++17 开始使用
if constexpr;在它之前,当T是一个整数时,c_str()也会被编译;所以错误 -
我使用的是 C++14。 Raspberry Pi 3 上的 g++ 7.2 MingW 和 g++ 6.2。
标签: c++ templates c++14 sfinae typetraits