簡體   English   中英

帶有單個模板參數的 `std::variant` 的目的是什么?

[英]What is the purpose of a `std::variant` with a single template parameter?

在此頁面上的示例中: https://en.cppreference.com/w/cpp/utility/variant有一個帶有單個模板參數的std::variant

std::variant<std::string> x("abc");

由於一個變體允許存儲一個可以屬於一組不同類的 object,那么上一行的目的是什么? 不應該與以下內容相同:

std::string x("abc");

它的目的是證明std::variant可以使用變體類型的轉換構造函數之一,只要它是明確的。

使用這個例子可能會更好一些

std::variant<std::string, int> x("abc");

相反,為了更清楚地展示這一點。

取決於您所說的“相同”是什么意思。 這兩行代碼在 memory 中肯定沒有相同的布局,也沒有相同的訪問模式。

至於它存在的原因,嗯——對稱。 如果您要支持大量模板 arguments,沒有什么能阻止您也支持一個。 事實上,如果它走遞歸路線(如 C# 的值元組),它可以使實現更容易。 所以只要把它扔進去,讓人們根據需要使用它。

該特定行的重點是演示“轉換構造函數在明確時起作用”。

允許帶有單個模板參數的std::variant的意義在於,會產生實現成本,而收益不足以證明成本合理。

允許帶有單個模板參數的std::variant的一個好處來自模板的強大功能。 也許庫提供了一個模板,其中一個參數必須是std::variant 從概念上講,這將是一個枚舉模板某些方面必須處理的各種類型的參數。 (這是否是一個好方法是一個單獨的問題。對於圖書館的用戶來說,這也是一個學術問題。)假設你有這個 class 的用途,但你只需要它來處理一個類型。 沒問題。 您使用std::variant<the_type>作為模板參數。 一個特殊情況是免費處理的(如果模板沒有錯誤),即使庫的作者沒有預料到這個用例。 std::variant必須具有至少兩個模板 arguments 相比,該模板更通用,涵蓋更多情況。

這是否過於理論化/在實踐中不太可能發生? 我沒有一個variant的例子,但我有一個tuple的例子。 與此問題類似,可以詢問具有單個模板參數的tuple的用途。 Q 的上下文:C++ tbb 流圖,multifunction_node 給出不完整類型錯誤涉及一個庫模板,該模板期望其參數之一是類型tuple 該問題的作者只有一種類型。 提供一種類型的tuple允許使用模板。 如果tuple必須采用至少兩個模板 arguments,那么該庫模板將更加通用。

暫無
暫無

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

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