模板中的嵌套类型名

Nested typenames in templates

本文关键字:嵌套类型      更新时间:2023-10-16

我想写一个这样的函数模板:

template< typename L<T> >  // does not work
void do_sth(L<T>& list){
    T value = 0;
    list.push_back(value);
}

这意味着,在模板中,我想使用提供"push_back"的容器,但也要使用存储在该容器中的类型。

一个变通方法是

template< typename T >
void do_sth(typename std::list<T>& list){
    T value = 0;
    list.push_back(value);
}
// call    
std::list<double> list;
do_sth<double>(list);

这是多余的,因为a)我在声明"list"时已经指定了"double", b)该函数不能与std::vector一起工作,尽管实现将完全适合。

有谁知道如何做到这一点吗?

这是STL容器提供value_type类型定义的原因之一:

template< typename Container >
void do_sth(Container& list){
    typename Container::value_type value = 0;
    list.push_back(value);
}

由于模板参数推导,您的解决方案也可以使用对do_sth(list);的普通调用。

你可以这样做:

template< typename T >
void do_sth( T & list){
    typename T::value_type value = 0;
    list.push_back(value);
}