我可以轻松地创建一个模板函数,它接受任意类型的任意容器并对其进行操作吗?

时间:2011-12-22 18:46:18

标签: c++ templates

我正试图让这样的事情发挥作用:

// This method is wrong, won't work, need your help
template < template <typename T> class U >
void foo(U& u) 
{
  T& blah = *u.begin();
}

int main(int, char**)
{
  vector<int> myVec(4, 10);
  foo<vector<int> >(myVec); // This is how I want to call it, even better if I can leave the parameters out and just do foo(myVec);
  return EXIT_SUCCESS;
}

我想要做的是避免以下情况,因为它似乎是多余的:

template <typename T, typename U>
void foo(U& u)
{
T& blah = *u.begin(); 
}

int main(int, char**)
{
  vector<int> myVec(4, 10);
  foo<int, std::vector<int> >(myVec); // first int in parameters is redundant cause I already provide int as arg to vector
  return EXIT_SUCCESS;
}

5 个答案:

答案 0 :(得分:8)

你可以这样做:

template <typename U>
void foo(U& u)
{
    typedef typename U::value_type T;
    T& blah = *u.begin(); 
}

int main(int, char**)
{
  vector<int> myVec(4, 10);
  foo(myVec);
  return EXIT_SUCCESS;
}

答案 1 :(得分:6)

你可以这样做:

template < typename U>
void foo(U& u) 
{
  typename U::value_type blah = *u.begin();
}

答案 2 :(得分:5)

试试这个:

#include <vector>

template <template <typename, typename> class Cont, typename T, typename Alloc>
void foo(Cont<T,Alloc>& cont)
{
    T& blah = *cont.begin();
}

int main(int, char**)
{
    std::vector<int> myVec(4, 10);
    foo(myVec);
    return EXIT_SUCCESS;
}

原始版本的问题是vector有一个额外的模板参数(分配器类型)。此外,您需要指定模板参数,如上所述。

所有这些都说,我想我更喜欢Oli和FreakEnum的版本,因为它更通用! :)

答案 3 :(得分:2)

如果您需要这个类似容器的类型,而不遵循有关value_type typedef的STL约定,那么您需要一个标记系统。这是一个如何使这项工作的例子。

template <typename U>
struct foo_tags {
   typedef typename U::value_type value_type;
};

template <typename U>
void foo(U& u)
{
    typedef foo_tags<U>::value_type T;
    T& blah = *u.begin(); 
}

class my_very_special_int_container {
 public:
   int *begin();
};

template <>
struct foo_tags<my_very_special_int_container>
{
    typedef int value_type;
}

int main(int, char**)
{
  vector<int> myVec(4, 10);
  foo(myVec);
  my_very_special_int_container c;
  foo(c);
  return EXIT_SUCCESS;
}

答案 4 :(得分:1)

使用std::vector<int>::reference类型?那是你要求的吗?