簡短的問題:我可以typedef一個可變參數包嗎?我需要template <typename ...T> struct Forward { typedef T... args; };
。Variadic typedefs或「Bimaps done the C++ 0x way」
龍版本:
我在想重新實現C++ 0x中的出色boost bimap。回想一下,S
和T
兩種類型的bimap是和T y
之間的關係的std::set
。這些對象本身存儲在兩個獨立的內部容器中,並且這些關係跟蹤我想要的關聯迭代器;這兩種類型都可以通過「左」和「右」查找作爲鍵。取決於內部容器的選擇,值可能是唯一的或不是,例如,如果左邊的容器是一個集合,而右邊的容器是一個多層集合,那麼一個x
可以映射到許多不同的y
,右邊的查找會給出一個等值範圍。流行的內部容器是set
,multiset
,vector
和list
,也可能是unordered_*
版本。
所以我們需要接受兩個容器中,作爲模板參數的類型:
class Bimap<S, T, std::set, std::multiset>
但我們必須接受的容器可以採取任意許多爭論,因此我們需要通過所有這些,太。如果我們只需要一個一組可變參數,它不會是一個問題,因爲我們可以直接通過這些。但是,現在我們需要套的參數,所以我想寫一個轉發器,使用像這樣:
Bimap<int, int, std::set, std::set, Forward<std::less<int>, MyAllocator>, Forward<std::greater<int>, YourAllocator>> x;
這是我想出了模板:
#include <set>
#include <cstdint>
template <typename ...Args>
struct Forward
{
typedef Args... args; // Problem here!!
static const std::size_t size = sizeof...(Args);
};
template <typename S, typename T,
template <typename ...SArgs> class SCont,
template <typename ...TArgs> class TCont,
typename SForward = Forward<>, typename TForward = Forward<>>
class Bimap
{
typedef SCont<S, typename SForward::args> left_type;
typedef TCont<T, typename TForward::args> right_type;
template <typename LeftIt, typename RightIt> struct Relation; // to be implemented
typedef Relation<typename left_type::const_iterator, typename right_type::const_iterator> relation_type;
};
int main()
{
Bimap<int, int, std::set, std::set, Forward<std::less<int>>, Forward<std::greater<int>>> x;
}
不幸的是,在Forward
指定的行我無法弄清楚如何typedef參數包! (註釋的行給出一個編譯錯誤。)
[我想我可以去一個懶惰的版本Bimap<std::set<int, MyPred>, std::multiset<char, YourPred>> x;
並通過LeftCont::value_type
和RightCont::value_type
提取的類型,但我想那會更好,如果我能做出的密鑰類型我主模板參數並允許默認爲std::set
容器。]
哇,非常棒!我沒有意識到你可以通過模板中的其他參數追蹤可變參數。非常好! – 2011-06-16 15:56:36