簡體   English   中英

模板與lambda作為每個實例化的唯一默認參數

[英]template with lambda as unique default parameter on each instantiation

我正在尋找一種方法來自動使默認模板參數在每次實例化模板時都是唯一的。 由於lambda表達式創建的未命名函數對象具有不同的類型,我想以某種方式采用它們。 隨着標准愚蠢刪除的最近更改“一個lambda表達式不會出現在......模板參數中”限制(參見未評估上下文中的lambdas的措辭 ),這似乎是一個好主意。 所以我編寫了以下有點編寫最近gcc和clang的工作片段:

#include <type_traits>

template<void ( * ) (void) = [](){}> class
unique final {};

static_assert(false == ::std::is_same_v<unique<>, unique<>>);

int main()
{
    return 0;
}

這是一種可行的方法還是其中一種“形成不良,無需診斷”的案例?

一些額外的上下文:我想使用它來實現Ada樣式的強類型定義,這些定義應該在單個翻譯單元中工作,而無需手動發明未使用的唯一標記:

struct _tag_WowInt {};
using Int = type<int, _tag_WowInt>;
struct _tag_SoUnique {};
using DifferentInt = type<int, _tag_SoUnique>;

Upd1:我想提一下,涉及__COUNTER__或類似宏的方法在一般情況下不起作用,因為它們只會被預處理器擴展一次, 例如在模板內部使用時不會產生唯一類型

我相信你是對的,在我看來,這是“形成不良,無需診斷”。 我認為[temp.res / 8.4][temp.res / 8.5]涵蓋了這個問題:

(8.4) - 由於不依賴於模板參數的構造,或者由於不依賴於模板參數的構造,在其定義之后立即對模板進行假設實例化,或者

(8.5) - 在假設實例化中對這種構造的解釋不同於在模板的任何實際實例化中對相應構造的解釋 [ 注意 :在包括以下情況的情況下會發生這種情況:

(8.5.1) - 非依賴名稱中使用的類型在定義模板但在執行實例化時完成時不完整,或者

(8.5.2) - 在模板定義中查找名稱時發現了一個using聲明,但實例化中相應作用域中的查找沒有找到任何聲明,因為using-declaration是一個包擴展而相應的包是空的, 要么

(8.5.3) - 實例化使用默認參數或默認模板參數,該參數尚未在定義模板的位置定義,或者

(8.5.4) - 模板實例化中使用的常量表達式評估

(8.5.4.1) - 整數或無范圍枚舉類型的const對象的值或

(8.5.4.2) - constexpr對象的值或

(8.5.4.3) - 參考或的值

(8.5.4.4) - constexpr函數的定義,並且在定義模板時未定義該實體,或

(8.5.5) - 由模板使用由非依賴的simple-template-id指定的類模板特化或變量模板特化,並且它是從模板未定義的部分特化實例化的。定義或命名一個在定義模板時未聲明的顯式特化。 - 結束說明 ]

即使您的用例未在說明的示例中明確列出,但在我的理解中,要求意味着unique<>必須在整個程序中引用相同的內容,否則它是錯誤的,不需要診斷。

這是CWG1850 委員會似乎不喜歡這種有狀態的元編程。 constexpr計數器不再適用於較新版本的編譯器。

暫無
暫無

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

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