2013-04-13 27 views
4

這看起來應該很簡單,但我一直在玩,並且還沒找到我正在尋找的解決方案,所以在這裏:C++`using`命令用於模板類別別名

我有以下結構(簡化當然說明目的):

template<typename T> 
struct test 
    { 
    using L = std::list<T>; 
    L::iterator a; 
    }; 

現在,這將引發錯誤:

error: need 'typename' before 'test<T>::K::iterator' because 'test<T>::K' is a dependent scope 

我已經找到固定的兩個方面,它至今都少比想法L:任何使用左旋之前

1)附加類型名稱:

template<typename T> 
struct test 
    { 
    using L = std::list<T>; 
    typename L::iterator a; 
    }; 

我寧願避免這種可能的話額外的詳細程度。

2)添加其他using語句的目標直接迭代器:

template<typename T> 
struct test 
    { 
    using L = std::list<T>; 
    using iter = typename L::iterator; 
    iter a; 
    }; 

但這需要不得不爲每個迭代器我想用做同樣的,如果我還希望訪問const_iterator等等,我寧願不必定義一堆使用語句。

那麼,有沒有寫using語句的方式,然後讓我寫:

L::iterator a; 
L::const_iterator b; 
... 

謝謝!

回答

14

typename必須在那裏,但你可以用一對夫婦的別名模板工具來避免每次定義一個新的iter類型:

template<typename C> 
using Iterator = typename C::iterator; 

template<typename C> 
using ConstIterator = typename C::const_iterator; 

template<typename T> 
struct test 
{ 
    using L = std::list<T>; 
    Iterator<L> i; 
    ConstIterator<L> ci; 
}; 
+0

這比我的元方法+1更好! – Yakk

+0

感謝您的回答!鑑於無法做到我喜歡的方式,這看起來是最乾淨的方式:) – jsdw

+0

@lytnus:很高興它幫助:) –

2

不,沒有。所有從屬類型必須以typename開頭,或通過typename前言引入。

現在,你可以某處創建list_iter<T>using declartion:

template<typename T> 
using list_iter = typename std::list<T>::iterator; 

甚至元ITER using語句:

template<template<typename>class container, typename T> 
using iter = typename container<T>::iterator; 
template<template<typename>class container, typename T> 
using const_iter = typename container<T>::const_iterator; 

這將讓你做的事:

struct test { 
    using L = std::list<T>; 
    iter<std::list,T> a; 
}; 

我在「隱藏」以外的struct聲明。

順便說一句,99%的時間std::list是錯誤的容器。

+1

我認爲這是行不通的,因爲'的std :: list'還接受額外的分配器類型參數(它有一個默認參數) –

+0

感謝您的回答!至於使用列表,這將是一個潛在的非常大的符號列表,通常需要刪除或插入保存在其他位置的位置(因此遍歷列表以找到它們不是問題);我認爲這是1%的情況之一:) – jsdw

+0

如果你在刪除它們之前遍歷'list'來找到它們,並且它們並不都聚集在列表前面或附近,那麼'vector'仍然更多高效。爲了獲得'list',你基本上需要添加和刪除它的元素*而不需要遍歷來查找元素*,因爲在vector中「移動」元素的代價通常比成本低廉遍歷一個'list'! (移動昂貴(即沒有移動和大量拷貝)的元素也可以讓'list'更具誘惑力,但即使'deque'也會勝出......)如果你還沒有分析,你錯了。 – Yakk