将 C 字符数组的 std::any 转换为字符串的 C++ std::any 函数
C++ std::any function that convert std::any of C char-array to string
#include <iostream>
#include <any>
#include <string>
#include <vector>
#include <map>
using namespace std;
string AnyPrint(const std::any &value)
{
cout << size_t(&value) << ", " << value.type().name() << " ";
if (auto x = std::any_cast<int>(&value)) {
return "int(" + std::to_string(*x) + ")";
}
if (auto x = std::any_cast<float>(&value)) {
return "float(" + std::to_string(*x) + ")";
}
if (auto x = std::any_cast<double>(&value)) {
return "double(" + std::to_string(*x) + ")";
}
if (auto x = std::any_cast<string>(&value)) {
return "string(\"" + (*x) + "\")";
}
if (auto x = std::any_cast<char*>(&value)) {
return string(*x);
}
}
int main()
{
int a = 1;
float b = 2;
double c = 3;
string d = "4";
char *e = "555";
cout << AnyPrint(a) << "\n";
cout << AnyPrint(b) << "\n";
cout << AnyPrint(c) << "\n";
cout << AnyPrint(d) << "\n";
cout << AnyPrint("555") << "\n";
cout << AnyPrint(e) << "\n";
return 0;
}
我正在尝试创建一个将 std::any
对象转换为字符串的函数,前提是可能的类型列表是硬编码的。但是,当用户解析像 AnyPrint("555")
这样的原始字符串时会出现问题。我使用
中的方法
当我 运行 程序时,我得到以下输出:
140722480985696, i int(1)
140722480985696, f float(2.000000)
140722480985696, d double(3.000000)
140722480985696, NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE string("4")
140722480985696, PKc string("4")
140722480985696, Pc 555
如何处理 std::any
的原始字符串?我不想写 AnyPrint("555"s)
除非这是唯一的方法。
编辑:我用这个来 运行 这个例子 https://www.onlinegdb.com/online_c++_compiler
"555"
的类型是 const char[4]
,可能会衰减到 const char*
。您处理 char*
,但不处理 const char*
。
处理 const char*
解决了您的问题:
std::string AnyPrint(const std::any &value)
{
std::cout << size_t(&value) << ", " << value.type().name() << " ";
if (auto x = std::any_cast<int>(&value)) {
return "int(" + std::to_string(*x) + ")";
}
if (auto x = std::any_cast<float>(&value)) {
return "float(" + std::to_string(*x) + ")";
}
if (auto x = std::any_cast<double>(&value)) {
return "double(" + std::to_string(*x) + ")";
}
if (auto x = std::any_cast<std::string>(&value)) {
return "string(\"" + (*x) + "\")";
}
if (auto x = std::any_cast<const char*>(&value)) {
return *x;
}
return "other";
}
如评论中所述,像 "555"
这样的字符串文字是(或衰减为)const char*
指针。您的 AnyPrint
函数无法处理此类参数类型。
添加以下块可解决问题:
if (auto x = std::any_cast<const char*>(&value)) {
return string(*x);
}
此外,请注意 char *e = "555";
这一行在 C++ 中是非法的;您需要 const char *e = "555";
或 char e[] = "555";
;使用后者将演示 std::any_cast<T>
块中 char*
(AnyPrint(e)
)和 const char*
(AnyPrint("555")
)类型之间的区别。
#include <iostream>
#include <any>
#include <string>
#include <vector>
#include <map>
using namespace std;
string AnyPrint(const std::any &value)
{
cout << size_t(&value) << ", " << value.type().name() << " ";
if (auto x = std::any_cast<int>(&value)) {
return "int(" + std::to_string(*x) + ")";
}
if (auto x = std::any_cast<float>(&value)) {
return "float(" + std::to_string(*x) + ")";
}
if (auto x = std::any_cast<double>(&value)) {
return "double(" + std::to_string(*x) + ")";
}
if (auto x = std::any_cast<string>(&value)) {
return "string(\"" + (*x) + "\")";
}
if (auto x = std::any_cast<char*>(&value)) {
return string(*x);
}
}
int main()
{
int a = 1;
float b = 2;
double c = 3;
string d = "4";
char *e = "555";
cout << AnyPrint(a) << "\n";
cout << AnyPrint(b) << "\n";
cout << AnyPrint(c) << "\n";
cout << AnyPrint(d) << "\n";
cout << AnyPrint("555") << "\n";
cout << AnyPrint(e) << "\n";
return 0;
}
我正在尝试创建一个将 std::any
对象转换为字符串的函数,前提是可能的类型列表是硬编码的。但是,当用户解析像 AnyPrint("555")
这样的原始字符串时会出现问题。我使用
当我 运行 程序时,我得到以下输出:
140722480985696, i int(1)
140722480985696, f float(2.000000)
140722480985696, d double(3.000000)
140722480985696, NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE string("4")
140722480985696, PKc string("4")
140722480985696, Pc 555
如何处理 std::any
的原始字符串?我不想写 AnyPrint("555"s)
除非这是唯一的方法。
编辑:我用这个来 运行 这个例子 https://www.onlinegdb.com/online_c++_compiler
"555"
的类型是 const char[4]
,可能会衰减到 const char*
。您处理 char*
,但不处理 const char*
。
处理 const char*
解决了您的问题:
std::string AnyPrint(const std::any &value)
{
std::cout << size_t(&value) << ", " << value.type().name() << " ";
if (auto x = std::any_cast<int>(&value)) {
return "int(" + std::to_string(*x) + ")";
}
if (auto x = std::any_cast<float>(&value)) {
return "float(" + std::to_string(*x) + ")";
}
if (auto x = std::any_cast<double>(&value)) {
return "double(" + std::to_string(*x) + ")";
}
if (auto x = std::any_cast<std::string>(&value)) {
return "string(\"" + (*x) + "\")";
}
if (auto x = std::any_cast<const char*>(&value)) {
return *x;
}
return "other";
}
如评论中所述,像 "555"
这样的字符串文字是(或衰减为)const char*
指针。您的 AnyPrint
函数无法处理此类参数类型。
添加以下块可解决问题:
if (auto x = std::any_cast<const char*>(&value)) {
return string(*x);
}
此外,请注意 char *e = "555";
这一行在 C++ 中是非法的;您需要 const char *e = "555";
或 char e[] = "555";
;使用后者将演示 std::any_cast<T>
块中 char*
(AnyPrint(e)
)和 const char*
(AnyPrint("555")
)类型之间的区别。