template typename<V> class holder{
private:
V* value;
public:
V* get();
void put (V* newValue);
}
Необходимо сделать связный список из элементов, производных от шаблона. Общее число элементов (пока) 6, дальше неизвестно.
Вроде бы получилось вот такое решение:
template < class V> class Holder {
private:
next* Holder;
prev* Holder; //если нужна обратная связь
V* value;
public:
V* get();
void put(V* value);
Holder* getNext();
Holder* getPrev();
};
Вот такой вариант пойдет?
Мне нужно template typename<template> list
Шаблоны "разрешаются" во время компиляции, и после нее не могут быть изменены, по этому можеть возникнуть куча проблем у компилятора при таком объявлении. Я бы попробовал посмотреть в сторону полиморфизма и виртуальных функций.
Bombers launch with no recall + Minutes warning of the missile fall
Take a look at your last sky + Guessing you won't have the time to cry
--- Iron Maiden (Brouther Than A Thousand Suns, 2006)
спасибо, это классический список. он не подходит по причине - мне нужно хранить 6 типов V* в одном списке. Про шаблоны знаю, но задача стоит именно такая
Сделать список который будет содержать произвольные предопределенные данные. Сижу, курю всякую литературу, пока результата нет
Fire and water, earth and sky - mistery surrounds us, legends never die!
Т.к. все равно придется задавать конкретные типы всем полям структуры (все 6 различных типов должны быть строго определены на момент компиляции), имеет смысл в отдельном .h файле разместить вышеприведенную структуру и использовать как Holder<Values>. Values безусловно может быть тоже шаблоном.
Bombers launch with no recall + Minutes warning of the missile fall
Take a look at your last sky + Guessing you won't have the time to cry
--- Iron Maiden (Brouther Than A Thousand Suns, 2006)
спасибо, это классический список. он не подходит по причине - мне нужно хранить 6 типов V* в одном списке. Про шаблоны знаю, но задача стоит именно такая
Сделать список который будет содержать произвольные предопределенные данные. Сижу, курю всякую литературу, пока результата нет
Не понял в чем проблема,
структура известна в момент компиляции ? тогда std::list
или структура определяется в run-time ? т.е. нужен класс типа VCL::TDataSet ? Я для этого написал свой класс.
А у вас в одном списке элементы будут одного и того же типа?
в том то и дело что нет. Единственное - они будут производными от шаблона.
Serik - структура известна на момент компиляции. проблема в том что она не одна. Что такое VCL::DataSet и можно ли посмотреть на Ваш класс?
Структура с всеми полями известного типа не подходит-класс библиотечный
Fire and water, earth and sky - mistery surrounds us, legends never die!
спасибо, это классический список. он не подходит по причине - мне нужно хранить 6 типов V* в одном списке. Про шаблоны знаю, но задача стоит именно такая
Сделать список который будет содержать произвольные предопределенные данные. Сижу, курю всякую литературу, пока результата нет
Не до конца понимаю. Или это делается классическим списком (хоть связным, хоть массивом) указателей на класс, от которого наследуется всё то что предполагается в этом массиве хранить или вы хотите странного.
Не до конца понимаю. Или это делается классическим списком (хоть связным, хоть массивом) указателей на класс, от которого наследуется всё то что предполагается в этом массиве хранить или вы хотите странного.
upd Или это делается с помощью указателя на void
Возможно я хочу странного. Попытаюсь еще раз подробно описать ситуацию. В приведенном шаблоне класса Holder интерес представлят только сигнатура V* get(), позволяющая получить типизированное значение переменной. Типов V пока 6, возможно их будет больше => сейчас есть 6 классов с разным типом возвращаемого значения. Это меня полностью устраивает. Мне нужен список из элементов, определенных шаблоном, причем в списке могут быть как одинаковые, так и разные элементы. Void* как вариант хранения - тогда не нужны все эти пляски с шаблонами, достаточно void* get(),, но я не могу в рантайме кастовать void* к требуемому типу - он может быть любым + не хочется делать все через <dynamic_cast>
Fire and water, earth and sky - mistery surrounds us, legends never die!
Возможно я хочу странного. Попытаюсь еще раз подробно описать ситуацию. В приведенном шаблоне класса Holder интерес представлят только сигнатура V* get(), позволяющая получить типизированное значение переменной. Типов V пока 6, возможно их будет больше => сейчас есть 6 классов с разным типом возвращаемого значения. Это меня полностью устраивает. Мне нужен список из элементов, определенных шаблоном, причем в списке могут быть как одинаковые, так и разные элементы. Void* как вариант хранения - тогда не нужны все эти пляски с шаблонами, достаточно void* get(),, но я не могу в рантайме кастовать void* к требуемому типу - он может быть любым + не хочется делать все через <dynamic_cast>
Так. Стандартно это делается следующим образом: Мы наследуем все 6 классов от Holder и делаем обычный нешаблонный список указателей на Holder. После этого вызываем виртуальную функцию из класса Holder, которая перепределена для каждого класса так, чтобы сделать нечто, зависящее от типа класса.
Вы хотите чтобы эти классы возвращали разные типы. Это невозможно, поскольку вы не сможете потом этими результатами воспользоваться. Они же неизвестного типа! В стандарте c++ anytype нет.
tip: попробуйте написать пример использования вашего хитрого списка и поймёте, о чём я.
Да, и мне кажется, вы зря пытаетесь смешать объекты с шаблонами.
Не для гуру лучше бы сначала написать обычные классы, а потом делать их шаблонными.
Шаблоны разрешаются на этапе компиляции. Шаблонный класс с разным параметром шаблона -- это два разных класса. Мне кажется, вы это не учитываете.
Да, и мне кажется, вы зря пытаетесь смешать объекты с шаблонами.
Не для гуру лучше бы сначала написать обычные классы, а потом делать их шаблонными.
Шаблоны разрешаются на этапе компиляции. Шаблонный класс с разным параметром шаблона -- это два разных класса. Мне кажется, вы это не учитываете.
Я это прекрасно знаю и учитываю. Осталось только написать холдер, который умеет держать шаблонные параметры.
Fire and water, earth and sky - mistery surrounds us, legends never die!
Так. Стандартно это делается следующим образом: Мы наследуем все 6 классов от Holder и делаем обычный нешаблонный список указателей на Holder. После этого вызываем виртуальную функцию из класса Holder, которая перепределена для каждого класса так, чтобы сделать нечто, зависящее от типа класса.
Вы хотите чтобы эти классы возвращали разные типы. Это невозможно, поскольку вы не сможете потом этими результатами воспользоваться. Они же неизвестного типа! В стандарте c++ anytype нет.
tip: попробуйте написать пример использования вашего хитрого списка и поймёте, о чём я.
Кроме того, я нашел варианты решения данной задачи, сейчас экспериментирую.
serzh-z - спасибо это почти то что нужно и к чему я пришел. <dynamic_cast> не хотелось бы распихивать по всему коду.
Fire and water, earth and sky - mistery surrounds us, legends never die!
Осталось только написать холдер, который умеет держать шаблонные параметры.
осталось понять, почему не устраивает dynamic_cast, если для корректного использования списка всё равно нужно знать, результат какого типа мы извлекаем.
Кроме того, я нашел варианты решения данной задачи, сейчас экспериментирую.
serzh-z - спасибо это почти то что нужно и к чему я пришел. <dynamic_cast> не хотелось бы распихивать по всему коду.
Это не нескафе список. Это ассоциативный массив какой-то.
Поделитесь пожалуйста результатом -- очень интересно понять, что же всё-таки было нужно.