2010-03-29 54 views
4

想象我有一個模板函數是這樣的:C++ - typedef「內部」模板參數?

template<typename Iterator> 
void myfunc(Iterator a, typename Iterator::value_type b) 
{ ... } 

是否有實現相同的事情由申報迭代一個typedef ::值類型,我可以在函數簽名使用的方法嗎?舉例來說,我寧願能夠做這樣的事情:

template< 
    typename Iterator, 
    typedef Iterator::value_type type> 
void myfunc(Iterator a, type b) 
{ ... } 

到目前爲止,我已經使出使用默認模板參數和Boost概念檢查,以確保默認總是使用:

template< 
    typename Iterator, 
    typename type = typename Iterator::value_type > 
void myfunc(Iterator a, type b) 
{ 
    BOOST_STATIC_ASSERT((
     boost::is_same< 
      typename Iterator::value_type, 
      type 
     >::value 
    )); 
    ... 
} 

......但如果在這種類型的東西的語言支持,這將是很好的。

編輯

我也許應該使用一個類,而不是一個功能,因爲默認參數是不是功能標準。

template< 
    typename T, 
    typename V = typename T::value_type> 
class A : public B<T, V> 
{ 
    BOOST_STATIC_ASSERT((boost::is_same<typename T::value_Type, V>::type)); 
}; 
+0

備註:函數模板上的默認模板參數是擴展名。他們不在C++ 03中。 – 2010-03-29 07:20:54

+0

我固定了你的另一個省略typename的地方。希望你不介意。 – 2010-03-29 07:21:49

回答

2

你正在尋找一個模板化的typedef一個模板函數定義內部使用。我不認爲你可以做到這一點...

你可以有一個模板類有一個靜態函數&的typedef ......但使用它得到醜陋:

template<typename Iterator> 
class arbitraryname 
{ 
public: 
    typedef typename Iterator::value_type value; 

    static void myfunc(Iterator a, value b) 
    { 
    value c = b; 
    cout << "Test" << c << endl;  
    } 
}; 

struct Foo 
{ 
    typedef int value_type; 
}; 

int main() 
{ 
    Foo f; 
    myfunc<Foo>(f,2); // Old way. 
    arbitraryname<Foo>::myfunc(f,3); // With templated class. 
} 

個人而言,在這種情況下,我會用的#define去...

#define VALUE_TYPE typename Iterator::value_type 
template<typename Iterator> 
void myfunc(Iterator a, VALUE_TYPE b) 
#undef VALUE_TYPE 
{ 
    typedef typename Iterator::value_type bar; 
    bar z = b; 
    cout << "Test" << z << endl; 
} 

當然的#define的是醜陋和罪惡。但是,代碼是痛苦地鈍讀...

p.s.爲了安全起見,您可能需要添加:

#ifdef VALUE_TYPE 
#error "VALUE_TYPE already defined!" 
#endif 
2

您可以在參數列表中使用typename

template <typename Iterator> 
void myfunc(Iterator a, typename Iterator::value_type b) 
{ 
} 
+0

哦,缺少的typename是我的例子中的一個bug,謝謝你的注意。但是,這不是我想要回答的問題。我真的很喜歡使用b的typedef來減少函數簽名的冗長。 – 2010-03-29 02:12:20

+0

@redmoskito:我不知道我明白你想要完成什麼。你的第二個代碼片段比第一個片段長,第三個片段比較龐大。只看冗長,第一個是最好的選擇。據我所知,這也是你唯一的選擇。沒有辦法完成你在第二個代碼片段和第三個代碼片段中顯示的內容,而在C++ 0x中允許的內容在C++ 03中是無效的(只有類模板可以在C++ 03中具有默認模板參數)。 – 2010-03-29 02:33:16

+0

你可能會變得不那麼冗長,但IMO從你的函數簽名中刪除你的迭代器的顯式類型將使它不那麼清晰,除非你選擇了比'type'更好的措詞 – hhafez 2010-03-29 02:36:32