Могу ли я легко создать шаблонную функцию, которая принимает произвольный контейнер произвольного типа и работает с ним? - PullRequest
3 голосов
/ 22 декабря 2011

Я пытаюсь заставить что-то вроде этого работать:

// 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 ]

8 голосов
/ 22 декабря 2011

Вы можете просто сделать:

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;
}
6 голосов
/ 22 декабря 2011

вы можете сделать:

template < typename U>
void foo(U& u) 
{
  typename U::value_type blah = *u.begin();
}
5 голосов
/ 22 декабря 2011

Попробуйте это:

#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, так как она более общая! :)

2 голосов
/ 22 декабря 2011

Если вам это нужно для работы с контейнероподобными типами, которые не следуют соглашениям STL относительно value_type typedef, тогда вам нужна система тегов.Вот пример того, как вы могли бы сделать эту работу.

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;
}
1 голос
/ 22 декабря 2011

Использовать std::vector<int>::reference тип?Это то, что вы просите?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...