Есть у меня функция которая принимает любые аргументы и как мне из
class T сделать обратно string ?
Проверяю или это стринг через typeif(T) == typeid(string)
В смысле сделать обратно? В шаблоне это уже std::string, т.к. при каждом использовании шаблона с новым типом генерируется новая функция для этого конкретного типа. Не совсем понятно, что именно ты хочешь.
Recardo_Recoly , все равно ничего не понятно. Тебе явно плохо дается доказательство без знаний. :)
Бросай затею обойтись минимумом разглашения информации. Предоставь код, возможно так будет понятнее, что тебе надо.
Если что, обобщенная функция сериализации могла бы выглядеть вот так:
template< typename TValue >
inline void Write( const TValue& value );
template<>
inline void Write( const std::string& value ) {}
template<>
inline void Write( const std::wstring& value ) {}
template<>
inline void Write( const int32_t& value ) {}
Евгений Шатунов, Вот вы показали...
template< typename TValue >
inline void Write( const TValue& value );
А как мне в функции Write получить класс string из TValue ?
А то std:string str = value; не работает.
Вот что мне надо было...
У тебя есть задача: сделать сериализацию значения произвольного типа.
Включаем моск и начинаем думать. Как нам через одно имя функции обработать значения разных типов? Для этого у нас есть два механизма. Всего два.
Первый механизм - это перегрузка функции. Удобная, простая как грабли. Главное - объявления вовремя подпихивай и все будет работать.
Второй механизм - это шаблон функции и его частная специализация для конкретного типа данных. Это уже посложнее.
Зачем тебе std::string из TValue, если TValue - это параметр шаблона? TValue становится известным только в момент вывода шаблона для конкретного типа. У тебя есть возможность сделать частную специализацию для типа std::string, в рамках которой уже нет никакого TValue, а есть конкретный std::string.
При использовании любого из двух механизмов ты приходишь к одинаковому по своей сути выходу - у тебя есть функция, в которой есть параметр конкретного типа, с которым строго понятно как и что делать.
Посмотри у меня в примере повнимательнее. У меня нет определения для шаблонной функции, есть только ее объявление. И это крайне важный момент.
Определения есть только для случаев частной специализации этого шаблона. И это второй важный момент.
Recardo_Recoly , тут я могу только посоветовать поизучать метапрограммирование. :)
Есть вариант не писать почти одинаковый код для каждого типа, а обойтись только универсальными конструкциями для семейств типов. Но тебе надо обладать базисом знаний метапрограммирования. Обладать им нужно именно тебе хотябы просто потому что если вот я возьму и выкачу тебе рабочий код, он не будет решать полностью всех нужных тебе задач. И тебе потребуется расширить его, но ты ведь не сможешь. А это уже потеря самостоятельности.
Когда вы используете шаблонную функцию где-то в программе, вы явно подставляете тип данных. Этот тип данных будет подставлен в шалон во время компиляции. Т.е. динамически в программе С++ тип данных нельзя определить. Если хотите создать динамический тип, то можно использовать абстрактный класс и явное преобразование типов при конвертации к дочернему классу.