Шаблон функции, параметризованный распределителем, который используется для создания контейнеров разных типов

Я хочу функцию foo вдоль этих линий

template <class T, class Alloc>
void foo(T param, Alloc a) {
vector<int, Alloc<int> > vect_of_ints;
list<float, Alloc<float> > list_of_floats;
do_something()
}

std::allocator a
foo(42, a);

Это терпит неудачу, я думаю, потому что std::allocator не является четко определенным типом, пока он не был специализирован для определенного типа. Можно ли делать то, что я хочу делать, но каким-то другим способом.

3

Решение

Вы не можете иметь один экземпляр распределителя (a) и ожидать, что он будет работать для 2 разных типов. Однако вы можете использовать универсальный тип allocator (параметр шаблона шаблона) и специализировать его в вашей функции foo () двумя различными способами.
Вы все равно не используете «a» в своей функции foo ().

template <template<class> class Alloc, class T>
void foo(T t1, T t2) {
vector<int, Alloc<int> > vect_of_ints;
list<float, Alloc<float> > list_of_floats;
do_something()
}

// UPDATE: You can use a function wrapper, and then the compiler will be
// able to figure out the other types.
template<class T>
void foo_std_allocator(T t1, T t2)
{
foo<std::allocator, T>(t1, t2);
}int main()
{
//std::allocator a;
//foo<std::allocator>();
foo<std::allocator, int>(1, 2);

// in the call below, the compiler easily identifies T as int.
// the wrapper takes care of indicating the allocator
foo_std_allocator(1, 2);

return 0;
}
4

Другие решения

Других решений пока нет …