在c ++

时间:2018-10-07 12:25:29

标签: c++ class templates

我使用模板在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 :(得分:0)

假设您的堆栈看起来与此类似;

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;
}

答案 1 :(得分:0)

您可以使用C ++ 17的std::anystd::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_alternativestd::get_ifstd::visit。它们可以帮助您检测元素的类型并采取相应的措施。


如果不可能使用C ++ 17,则可以使用boost::variant

如果boost和C ++ 17都不是一个选项,则您始终可以定义自己的类层次结构来容纳不同的类型。但是在那种情况下,您很可能会重新发明std::anystd::variant,但这不是一个好主意(除非您的目标是学习如何实现这些目标)。