приведение типа одного типа шаблона к другому типу шаблона в c ++ - PullRequest
0 голосов
/ 07 октября 2018

Я создал класс стека в c ++, используя шаблоны.Программа сначала запрашивает тип данных для ввода в стек, например.int, float, char и т. д. Я сомневаюсь, что я создал два объекта, например,

Stack<int> obj_integer(size);
Stack<char> obj_character(size);

Где Stack - это пользовательский класс, использующий шаблон, а size - размер стека, переданного пользователем.Затем, как я буду печатать, приведу объект "obj_integer" к объекту "obj_character".То есть я хочу, чтобы obj_integer теперь брал данные типа char вместо целого типа.

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Вы можете использовать C ++ 17's std::any, std::variant или определить свой собственный тип объекта:

Stack<std::variant<int, double, char>> obj_stack(size);

Если Stack имеет интерфейс, подобный std::vector, тогда использование будет выглядеть следующим образом:

obj_stack.push_back(12);
std::cout << std::get<int>(obj_stack.back()) << '\n';
obj_stack.push_back('x');
std::cout << std::get<char>(obj_stack.back()) << '\n';

Кроме того, посмотрите вверх std::holds_alternative, std::get_if и std::visit.Они могут помочь вам определить, к какому типу относится ваш элемент, и действовать соответственно.


Если C ++ 17 невозможен, то можно использовать boost::variant

Если ни Boost, ни C ++ 17 не являются опцией, вы всегда можете определить собственную иерархию классов для хранения различных типов.Но в этом случае вы, скорее всего, заново изобретаете std::any и std::variant, что не является хорошей идеей (если ваша цель не состоит в том, чтобы узнать, как эти вещи могут быть реализованы).

0 голосов
/ 07 октября 2018

при условии, что ваш стек выглядит примерно так:

template<typename Type>
class Stack
{
public:
    template<typename T>
    Stack(T t){}
};

вы можете статически разыгрывать как;

Stack<int> obj_integer(1);
Stack<char> obj_character('a');
obj_integer = static_cast<Stack<char>>(obj_character);

это одна вещь, которую вы не должны делать.представьте, что произойдет, если у stack будут некоторые члены, которые не будут обрабатываться статическим приведением.в итоге вы получите неправильно обработанное преобразование.

Так что лучшей альтернативой будет перегрузка операторов присваивания и конструкторов копирования, чтобы убедиться, что все преобразовано правильно.

template<typename Type>
class Stack
{
public:

    // template < typename T>
    template < typename T>
    Stack( const Stack< T > & obj ) //copy conustructor
    {
        // do conversion
    }

    template < typename T >
    Stack& operator=( const Stack< T > & obj ) //overloading assignment operator
    {
        // do conversion
        return *this;
    }

    template<typename T>
    Stack(T t){}

};


int main()
{

    Stack<int> obj_integer(1);
    Stack<char> obj_character('a');
    Stack<char> obj_character2('b');
    Stack<int> obj_integer2 = obj_character;  //copies the obj_character to  obj_integer2 using copy constructor
    obj_integer2 = obj_character2;            //assigns the obj_character2 to  obj_integer2 using assignment operator
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...