2

我正在尝试编写一个函数,它可以将任何标准容器(列表、堆栈、向量等)作为它的参数。我也想知道容器内的类型。这是我尝试过的。

#include<iostream>
#include<list>
#include<vector>

template<class data_type, template<class> class container_type>
void type(container_type<data_type>& _container){
        std::cout<<typeid(container_type).name()<<std::endl;
}


int main(){

    std::list<int> list_t;
    std::vector<int> vector_t;
    type(list_t);
    type(vector_t);
}

此函数中的 once 类型container_type始终是_Container_base_aux_alloc_emptywhich(我认为)是标准容器的基类。

这里发生了什么?

我如何让这个函数返回正确的类型?

4

4 回答 4

2

的typeidcontainer_type是没有用的,因为那只是一个模板类,而一个模板类根本就不是真正的类型,只是实例化之后才变成一个。所以你真正想要的是data_type值类型的类型,以及container_type<data_type>实例化容器的类型。更好的当然是container_type<data_type>::value_type取值类型。

请注意,大多数容器采用多个模板参数,因此最好使用可变参数模板编写:

template <template <typename...> class Container, typename ...Args>
void print_type(const Container<Args...> &)
{
  typedef typename Container<Args...>::value_type value_type;
  print(typeid(Container<Args...>).name());
  print(typeid(value_type).name());
}
于 2011-08-21T18:58:27.637 回答
1

我不会那么相信 typeid() 的输出。type_info::Name 不保证返回一些唯一标识符。所以很可能函数内部的类型就是你所期望的。

获得某种类型名称的最佳方法是使用宏,如下所示:

template<class data_type, template<class> class container_type>
void type_helper(container_type<data_type>& _container, const char* charStr){
        std::cout<< charStr << std::endl
}

#define type(container) type_helper(container, #container)
于 2011-08-21T18:47:36.023 回答
1

您已经有了容器的类型。是data_type。像这样使用它。如果有疑问,您还可以使用typename container_type::value_typewhich 是容器模板参数的 typedef。

这么多使用类型。返回类型在 C++ 中完全不同,通常被认为是模板元编程的一部分。

这个相当无意义的片段value_type从某种类型中提取T

template<typename T>
struct inner_type {
  typedef T::value_type value_type;
};

但是您不妨value_type直接使用 并避免这种混淆。

于 2011-08-21T18:54:19.243 回答
1

您的代码将不起作用,因为一旦有人换出分配器或类似的东西,那么您就完成了。如果在 C++03 中,您应该使用任何 T 并使用::value_type,或者在 C++0x 中进行类型推导。

此外,.name()根本没有定义为返回任何有用的东西。在任何情况下。实现可以为每种类型返回“har har sinker!祝你好运,使用此语言功能”并符合要求。

于 2011-08-21T18:54:58.313 回答