gpt4 book ai didi

c++ - String 和 Int 之间的模板冲突

转载 作者:太空狗 更新时间:2023-10-29 22:55:54 24 4
gpt4 key购买 nike

我有一个程序使用 json-glib 为 ReST Server 创建一个 JSON 文件。该文件有 2 个字段,即 idvalueid 只是 std::string 但值可以是整数、 bool 值、字符串(通过 std::string od char const *) 或 float ,具体取决于要传输的值。我在 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;
}


}

error: request for member ‘c_str’ in ‘tagValue’, which is of non-class type ‘int’ if(json_builder_add_string_value (builder, tagValue.c_str()) == nullptr)

error: invalid conversion from ‘int’ to ‘const gchar* {aka const char*}’ [-fpermissive]

最佳答案

I'm using C++14

可惜了。您不能使用 if constexpr 这是您问题的自然解决方案,但它是从 C++17 引入的。

无论如何,如果没有if constexpr,编译器必须编译你函数的每一部分;因此,如果您的 tagValuebool,编译器还必须编译 tagValue.c_str() 调用,该调用不适用于 > bool

所以错误。

C++17 之前你必须为不同的类型开发不同的函数。

一个可能的解决方案是使用重载和 SFINAE 定义三个非模板 foo() 函数用于三种确切的类型 (bool, std::string const &char const *)

void foo (std::string const & id, bool value)
{
// json_builder_add_boolean_value, etc

std::cout << "-- bool case: " << id << ", " << value << std::endl;
}

void foo (std::string const & id, std::string const & value)
{
// json_builder_add_string_value, etc

std::cout << "-- std::string case: " << id << ", " << value << std::endl;
}

void foo (std::string const & id, char const * value)
{
// json_builder_add_string_value, etc

std::cout << "-- char * case: " << id << ", " << value << std::endl;
}

和两个模板 foo() 函数,通过 SFINAE 为整数类型(第一个)和浮点类型(第二个)启用

template <typename T>
std::enable_if_t<std::is_integral<T>{}>
foo (std::string const & id, T const & value)
{
// json_builder_add_int_value, etc

std::cout << "-- integral case: " << id << ", " << value << std::endl;
}

template <typename T>
std::enable_if_t<std::is_floating_point<T>{}>
foo (std::string const & id, T const & value)
{
// json_builder_add_double_value, etc

std::cout << "-- floating case: " << id << ", " << value << std::endl;
}

这么叫

   foo("1", false);
foo("2", 0L);
foo("3", 0.0f);
foo("4", std::string{"zero"});
foo("5", "zero");

你得到

-- bool case: 1, 0
-- integral case: 2, 0
-- floating case: 3, 0
-- std::string case: 4, zero
-- char * case: 5, zero

观察到bool是整型,所以可以匹配foo()模板整型和foo() bool 具体版本。

在这种情况下,首选完全匹配,因此调用 bool 特定版本。

关于c++ - String 和 Int 之间的模板冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49878113/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com