簡體   English   中英

具有std :: any值的unordered_map不能any_cast字符串

[英]unordered_map with std::any values cannot any_cast string

我是C ++的新手,正在研究std::unordered_mapstd::any 我創建了一個示例演示波紋管,它會生成一些虛擬數據,然后將它們插入到地圖中。

之后(在注釋掉的代碼中)我成功地使用any_cast打印出值。

但是,您可能會看到在底部,我嘗試檢索成功為0的特定鍵。 我得到的錯誤是Bad any_cast ,並且轉換與我用於打印的代碼完全相同(當前已注釋掉)。

如果這是一個愚蠢的錯誤,我很抱歉,但是我很新。 先感謝您。

#include <iostream>
#include <string>
#include <any>
#include <map>
#include <unordered_map>
#include <time.h>
#include <Windows.h>

std::unordered_map<std::string, std::any> map = {};

int main() {

    unsigned long started = clock();
    const std::string prefix = "key";

    for (int i = 0; i < 1000000; i++) {

        const std::string key = "key" + std::to_string(i);

        map.insert_or_assign(key, i);

    }

    std::cout << "Data inserted after: " << (clock() - started) << "ms" << std::endl;

    system("pause");

    started = clock();

    /*
    for (const auto& item : map) {


        try {

            //std::cout << item.second.type().name() << std::endl;
            if (item.second.type() == typeid(int)) {
                std::cout << std::any_cast<const int>(item.second) << std::endl;
            }
            else if (item.second.type() == typeid(float)) {
                std::cout << std::any_cast<const float>(item.second) << std::endl;
            }
            else if (item.second.type() == typeid(double)) {
                std::cout << std::any_cast<const double>(item.second) << std::endl;
            }
            else if (item.second.type() == typeid(long)) {
                std::cout << std::any_cast<const long>(item.second) << std::endl;
            }
            else if (item.second.type() == typeid(char const *)) {
                std::cout << std::any_cast<char const *>(item.second) << std::endl;
            }
            else if (item.second.type() == typeid(std::string)) {
                std::cout << std::any_cast<const std::string>(item.second) << std::endl;
            }
            else {
                std::cout << item.first << " has an unhandled value type of " << item.second.type().name() << std::endl;
            }

        }
        catch (const std::bad_any_cast& err) {
            std::cerr << err.what() << std::endl;
        }



    }

    std::cout << "Map iterated after: " << (clock() - started) << "ms" << std::endl;

    */

    try {

        auto value = std::any_cast<char const *>(map["key8745"]);

        std::cout << "Key " << value << " retrieved after: " << (clock() - started) << "ms" << std::endl;

    }
    catch (const std::bad_any_cast &err) {
        std::cerr << err.what() << std::endl;
    }

    system("pause");

    return 0;

}

您插入的所有值都是int ,但是您試圖將底部的單個值強制轉換為char const* 它不是任何類型的指針,並且似乎any_cast是足夠類型安全的,可以拒絕進行any_cast嘗試(這是一件好事,因為將指針指向內存地址8745引用很可能會發生段錯誤)。 您在較早的代碼中進行類型檢查,並大概在那里選擇了正確的轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM