亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
1. Including and Basic Usage
2. Retrieving Values with std::any_cast
Retrieving with Correct Type (Success)
Safe Retrieval with Pointer Cast
3. Checking and Managing Types
4. Clearing or Resetting std::any
5. Storing Custom Types
6. Limitations and Workarounds
7. Practical Example: Heterogeneous Container
首頁(yè) 后端開(kāi)發(fā) C++ 如何與std :: c一起工作

如何與std :: c一起工作

Sep 23, 2025 am 06:45 AM
c++ std::any

std::any 是 C 17 引入的類型安全的任意類型存儲(chǔ)工具,可用于保存和檢索任意可復(fù)制的類型,適用于配置系統(tǒng)、插件接口等需要異構(gòu)數(shù)據(jù)容器的場(chǎng)景;使用時(shí)需包含 頭文件,并通過(guò) std::any_cast 安全提取值,配合 .type() 與 typeid 檢查類型,避免異常;支持自定義類型存儲(chǔ),但不支持直接存儲(chǔ) move-only 類型,可通過(guò) std::unique_ptr 包裝解決;存在性能開(kāi)銷且無(wú)隱式類型轉(zhuǎn)換,適合非性能關(guān)鍵路徑的動(dòng)態(tài)類型需求,但不應(yīng)替代模板或多態(tài)機(jī)制,使用時(shí)必須確保類型匹配后才進(jìn)行提取,以保證類型安全,最終實(shí)現(xiàn)靈活而安全的泛型數(shù)據(jù)處理。

How to work with std::any in C

Working with std::any in C allows you to store and retrieve values of any type safely, as long as you manage type checks and access properly. It's part of the C 17 standard library and is useful when you need heterogeneous data containers—like when building configuration systems, plugin interfaces, or generic data holders.

Here’s how to use std::any effectively:


1. Including and Basic Usage

To use std::any, include the <any></any> header:

#include <any>
#include <iostream>
#include <string>

int main() {
    std::any value = 42;             // store an int
    value = std::string("hello");    // now store a string
}

You can assign values of any copyable type to a std::any object.


2. Retrieving Values with std::any_cast

To get the stored value, use std::any_cast. This is the only safe way to extract data.

Retrieving with Correct Type (Success)

std::any data = 3.14;
if (auto* ptr = std::any_cast<double>(&data)) {
    std::cout << *ptr << '\n';
}

Or directly (throws std::bad_any_access on type mismatch):

try {
    double d = std::any_cast<double>(data);
    std::cout << d << '\n';
} catch (const std::bad_any_access&) {
    std::cout << "Wrong type!\n";
}

Safe Retrieval with Pointer Cast

Using a pointer version of any_cast avoids exceptions:

if (const auto* str = std::any_cast<std::string>(&data)) {
    std::cout << "String: " << *str << '\n';
} else if (const auto* num = std::any_cast<int>(&data)) {
    std::cout << "Integer: " << *num << '\n';
}

This pattern is useful when handling multiple possible types.


3. Checking and Managing Types

You can check what type is stored using .type() and compare with typeid.

#include <typeinfo>

if (data.type() == typeid(std::string)) {
    std::cout << "It's a string!\n";
} else if (data.type() == typeid(int)) {
    std::cout << "It's an integer!\n";
}

This works well in combination with any_cast for safe dispatch.


4. Clearing or Resetting std::any

To make an std::any empty, assign {} or use .reset():

data.reset();  // now data.has_value() returns false

if (!data.has_value()) {
    std::cout << "No value stored.\n";
}

You can also check emptiness:

if (data.has_value()) {
    // safe to cast
}

5. Storing Custom Types

You can store user-defined types as long as they are copyable.

struct Person {
    std::string name;
    int age;
};

std::any p = Person{"Alice", 30};

if (const auto* person = std::any_cast<Person>(&p)) {
    std::cout << person->name << ", " << person->age << '\n';
}

Note: std::any requires the type to be copy-constructible. Move-only types (like std::unique_ptr) won’t work unless wrapped (see below).


6. Limitations and Workarounds

  • No move-only types directly: std::any needs copyability. But you can wrap move-only types in a std::unique_ptr:
std::any wrapper = std::unique_ptr<int>(new int(42));
if (auto* ptr = std::any_cast<std::unique_ptr<int>>(&wrapper)) {
    std::cout << "Value: " << **ptr << '\n';
}
  • Performance cost: Type erasure and dynamic allocation (for larger types) can add overhead. Avoid std::any in performance-critical paths if possible.

  • No implicit conversions: Even int to double fails. You must extract the exact stored type.


7. Practical Example: Heterogeneous Container

#include <vector>
#include <any>
#include <string>
#include <iostream>

int main() {
    std::vector<std::any> values = {1, "text", 3.14, std::string("hello")};

    for (const auto& v : values) {
        if (v.type() == typeid(int)) {
            std::cout << "int: " << std::any_cast<int>(v) << '\n';
        } else if (v.type() == typeid(const char*)) {
            std::cout << "char*: " << std::any_cast<const char*>(v) << '\n';
        } else if (v.type() == typeid(double)) {
            std::cout << "double: " << std::any_cast<double>(v) << '\n';
        } else if (v.type() == typeid(std::string)) {
            std::cout << "string: " << std::any_cast<std::string>(v) << '\n';
        }
    }
}

Note: String literals are const char*, not std::string, so be careful.


Basically, std::any is a type-safe union for when you need flexibility. Use it when you must store different types in the same variable or container, but always check types before casting. It's not a replacement for templates or polymorphism, but a tool for specific dynamic-type scenarios.

以上是如何與std :: c一起工作的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Stock Market GPT

Stock Market GPT

人工智能驅(qū)動(dòng)投資研究,做出更明智的決策

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門話題

如何編譯和運(yùn)行C程序 如何編譯和運(yùn)行C程序 Sep 16, 2025 am 05:29 AM

InstallaC compilerlikeg usingpackagemanagersordevelopmenttoolsdependingontheOS.2.WriteaC programandsaveitwitha.cppextension.3.Compiletheprogramusingg hello.cpp-ohellotogenerateanexecutable.4.Runtheexecutablewith./helloonLinux/macOSorhello.exeonWi

C自定義分配器示例 C自定義分配器示例 Sep 17, 2025 am 08:45 AM

自定義分配器可用于控制C 容器的內(nèi)存分配行為,1.示例中的LoggingAllocator通過(guò)重載allocate、deallocate、construct和destroy方法實(shí)現(xiàn)內(nèi)存操作日志記錄;2.分配器需定義value_type和rebind模板,以滿足STL容器類型轉(zhuǎn)換需求;3.分配器構(gòu)造與拷貝時(shí)觸發(fā)日志輸出,便于追蹤生命周期;4.實(shí)際應(yīng)用包括內(nèi)存池、共享內(nèi)存、調(diào)試工具和嵌入式系統(tǒng);5.C 17起construct和destroy可由std::allocator_traits默認(rèn)處理

如何在C中執(zhí)行系統(tǒng)命令 如何在C中執(zhí)行系統(tǒng)命令 Sep 21, 2025 am 04:35 AM

使用std::system()函數(shù)可執(zhí)行系統(tǒng)命令,需包含頭文件,傳入C風(fēng)格字符串命令,如std::system("ls-l"),返回值為-1表示命令處理器不可用。

C抽象類示例 C抽象類示例 Sep 15, 2025 am 05:55 AM

抽象類是包含至少一個(gè)純虛函數(shù)的類,不能被實(shí)例化,必須作為基類被繼承,且派生類需實(shí)現(xiàn)其所有純虛函數(shù),否則仍為抽象類。1.純虛函數(shù)通過(guò)virtual返回類型函數(shù)名()=0;聲明,用于定義接口規(guī)范;2.抽象類常用于統(tǒng)一接口設(shè)計(jì),如area()、draw()等,實(shí)現(xiàn)多態(tài)調(diào)用;3.必須為抽象類提供虛析構(gòu)函數(shù)(如virtual~Shape()=default;),確保通過(guò)基類指針正確釋放派生類對(duì)象;4.派生類繼承后需重寫純虛函數(shù),如Rectangle和Circle分別實(shí)現(xiàn)area()計(jì)算各自面積;5.可通過(guò)

如何在C中實(shí)現(xiàn)自定義迭代器 如何在C中實(shí)現(xiàn)自定義迭代器 Sep 20, 2025 am 01:13 AM

答案是定義包含必要類型別名和操作的類。首先設(shè)置value_type、reference、pointer、difference_type和iterator_category,然后實(shí)現(xiàn)解引用、遞增及比較操作,最后在容器中提供begin()和end()方法以返回迭代器實(shí)例,使其兼容STL算法和范圍for循環(huán)。

為什么實(shí)時(shí)系統(tǒng)需要確定性響應(yīng)保障? 為什么實(shí)時(shí)系統(tǒng)需要確定性響應(yīng)保障? Sep 22, 2025 pm 04:03 PM

實(shí)時(shí)系統(tǒng)需確定性響應(yīng),因正確性依賴結(jié)果交付時(shí)間;硬實(shí)時(shí)系統(tǒng)要求嚴(yán)格截止期限,錯(cuò)過(guò)將致災(zāi)難,軟實(shí)時(shí)則允許偶爾延遲;非確定性因素如調(diào)度、中斷、緩存、內(nèi)存管理等影響時(shí)序;構(gòu)建方案包括選用RTOS、WCET分析、資源管理、硬件優(yōu)化及嚴(yán)格測(cè)試。

如何在C中創(chuàng)建靜態(tài)變量 如何在C中創(chuàng)建靜態(tài)變量 Sep 19, 2025 am 05:24 AM

AstaticVariableInc witherinsitvaluebetwunctioncallsandisinitializedonce.2.Inideafunction,itpreservesstataTateAcrossCalls,siseascountingIterations.3.inaclass,itissharedamondamongallinStancessandMustancessandMustancessandMustbedIendEctIndEtheClastoAvoVovoiDlinkingErrors.4.StaticvariA.StaticvAriA.StaticVariA.StaticVariA

如何將整個(gè)文件讀取到C中的字符串中 如何將整個(gè)文件讀取到C中的字符串中 Sep 18, 2025 am 06:07 AM

使用std::ifstream和std::istreambuf_iterator可高效讀取文件全部?jī)?nèi)容到字符串,包括空格和換行,適用于中等大小文本文件。

See all articles