我正试图让这样的事情发挥作用:
// 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;
}
答案 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
类型?那是你要求的吗?