#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"). 我使用Checking std::any's type without RTTI中的方法
運行程式時得到以下輸出:
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
uj5u.com熱心網友回復:
的型別"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";
}
演示
uj5u.com熱心網友回復:
正如評論中提到的那樣,字串文字"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";要么 char*使用后者將演示塊中(with AnyPrint(e)) 和const char*(with AnyPrint("555")) 型別之間的區別std::any_cast<T>。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/454233.html
