我使用模板在c ++中创建了一个堆栈类。程序首先询问要输入到堆栈中的数据类型,例如。 int,float,char等 我的疑问是是否创建了两个对象,
Stack<int> obj_integer(size);
Stack<char> obj_character(size);
其中Stack是使用模板的用户定义的类,其中size是用户传递的堆栈的大小。然后,我将如何键入将对象“ obj_integer”转换为对象“ obj_character”。那就是我希望obj_integer现在将使用char类型的数据,而不是整数类型。
答案 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::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
,但这不是一个好主意(除非您的目标是学习如何实现这些目标)。