我有一個我正在寫的函式模板,這涉及很多型別的物件N(這只能是幾個不同的東西,而是在這個模板中有很多邏輯我不想在單獨復制職能)。在此函式的幾個位置,我也有像auto somevar = SomeFunction(someobject);在哪里someobject型別的宣告,N并SomeFunction超載,回傳不同型別的基于型別someobject- 但重要的是,沒有SomeFunction回傳的過載N。現在,而不是純變數,我希望擁有一個容器(特別是std::unordered_set),其元素是回傳的型別SomeFunction,但我無法弄清楚如何撰寫必要的類模板引數。
我試過std::unordered_set<auto>希望編譯器可以從初始化的元素中推斷出型別,但這不起作用。我嘗試過std::unordered_set<SomeFunction(someobject)>,但是std::unordered_set<SomeFunction(someobject)::type>,std::unordered_set<typeof(SomeFunction(someobject))>而且那些不起作用。似乎C 標準缺乏直接表達這一點的方法。
uj5u.com熱心網友回復:
正如其他人所說,你應該使用decltype。所以你會寫作std::unordered_set<decltype(SomeFunction(someobject))>你的回傳型別。
Sidenote:您可能會在線提及,typeof其中GCC編譯器在添加C 11之前添加了支持decltype。typeof以與C 標準的一部分相同的方式作業,decltype因此非GCC編譯器不支持。出于這個原因,您應該始終使用decltype而不是typeof。
uj5u.com熱心網友回復:
我所做的是寫一個some_transform可以像這樣用的類模板,std::unordered_set<some_transform<N>::Type>基本上some_transform將給定型別映射N到相應的回傳值SomeFunction。實際映射在模板類的專用中定義some_transform,因此它如下所示:
template <typename N> class some_transform
{
public:
typedef N Type; // this identity mapping is not useful, except so the IDE expects a member type by this name
};
template <> class some_transform<A>
{
public:
typedef X Type;
};
template <> class some_transform<B>
{
public:
typedef Y Type;
};
使用這個類模板,some_transform<A>::Type決議為型別X,并some_transform<B>::Type決議為輸入Y。這樣的表達some_transform<N>::Type可以在模板的引數來使用,其中一種型別的預期,在模板中與引數N,其中該實際型別引數(X或Y)取決于是否N是A或B。我只是必須確保該類正確映射賦予型別SomeFunction(如問題提到的)被回傳的相應型別SomeFunction。
請注意,識別符號Type不是特殊的,并且可以通過任何東西; 事實上,some_transform<N>該類可以有多種成員型別,即 G。 IndexType和HashType; 課程的名稱可能會更好TypeMap,因為成員型別的名稱指示已完成的轉換或映射。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/440105.html
