С++. Создание и инициализация произвольного std контейнера через template?

Пишу велосипеды:
template<typename SomeContainer, typename T, size_t n>
SomeContainer ContainerMake(const T(&array)[n])
{
   return SomeContainer(array, array + n);
}

const int vals1[] = { 0, 1, 2, 3, 4};

vector<int> vct1 = ContainerMake<vector<int> >(vals1);



Как избавиться от явного указания int при вызове ContainerMake?
  • Вопрос задан
  • 5353 просмотра
Пригласить эксперта
Ответы на вопрос 6
CleverMouse
@CleverMouse
Если же vector хочется оставить, а убрать только int, тогда даже дополнительного класса не нужно. Правда, нужно учитывать, что у std::vector на самом деле два параметра шаблона.
template<template<typename U, typename Allocator> class Container, typename T, size_t n>
Container<T, allocator<T> > ContainerMake(const T(&array)[n])
{
	return Container<T, allocator<T> >(array, array + n);
}

const int vals1[] = {0, 1, 2, 3, 4};
vector<int> vct1 = ContainerMake<vector>(vals1);

Ответ написан
EvilsInterrupt
@EvilsInterrupt
System programming, Reversing Engineering, C++
1) Или мне кажется или на самом деле вы пытаетесь сделать контейнеро-независимый код? Если да, то выбросьте эту затею из головы
2) Как-то не по-английски: «ContainerMake». Мои варианты 1) ContainerMaker или 2) makeContainer
Ответ написан
Talyutin
@Talyutin
Что именно вы хотите получить, может быть напишете больше примеров кода, который хотите звать, чтобы сконвертировать.
В вашем текущем конкретном случае можно передавать vec1 по ссылке в ContainerMake. Тогда добавите пару параметров шаблона для метода и все будет хорошо.
А вообще можно конечно и нагородить с использованием специализаций шаблонов (но это для структур, т.е. они будут типа фабрик) http://habrahabr.ru/post/54762/
Ответ написан
Комментировать
CleverMouse
@CleverMouse
Заведите вспомогательный класс, возвращайте его из ContainerMake и делайте основную работу в операторе приведения типа:
template<typename T, size_t n>
class MakerContainer
{
	const T* Array;
public:
	MakerContainer(const T* array) : Array(array) {}
	template<typename U>
	operator U() const
	{ return U(Array, Array + n); }
};

template<typename T, size_t n>
MakerContainer<T,n> ContainerMake(const T(&array)[n])
{
	return MakerContainer<T,n>(array);
}

const int vals1[] = {0, 1, 2, 3, 4};
vector<int> vct1 = ContainerMake(vals1);
Ответ написан
antonyter
@antonyter
Может проще?
template<typename SomeContainer,typename T, size_t n>
void ContainerMake(SomeContainer A, const T(&array)[n])
{
   A = SomeContainer(array, array + n);
}

const int vals1[] = { 0, 1, 2, 3, 4};

vector<int> vct1;
ContainerMake(vct1, vals1);
Ответ написан
Комментировать
@gribozavr
Просто используйте uniform initialization в C++11. Сегодня нет причин не использовать C++11.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы