所以我正在为C++中的赋值创建一个堆栈类。作业的核心是让我们熟悉模板。我一遍又一遍地读我的书,在这里看了一个又一个问题。
我需要让我的堆栈类能够由
Stack s2;
但是我在编译测试时出现错误.cpp并且只能在构造为
Stack<T> s1;
其中T
是std::string
、int
等。如何构建我的堆栈以便我可以同时使用两个构造函数?
堆栈.cpp
#include <iostream>
#include <vector>
#include <stdlib.h>
#include <string>
using namespace std;
template<typename T>
class Stack {
public:
Stack();
void Push(T val);
T Pop();
void Print();
private:
vector<T> vecT;
};
template <typename T>
Stack<T>::Stack() { }
template <typename T>
void Stack<T>::Push(T val) { vecT.push_back(val); }
template <typename T>
T Stack<T>::Pop() { vecT.pop_back(); }
template <typename T>
void Stack<T>::Print() {
cout << "[ ";
for(int i=0; i<vecT.size(); i++) {
cout << vecT[i] << " ";
}
cout << "]";
}
测试.cpp
#include <iostream>
#include <vector>
#include <stdlib.h>
#include <string>
#include "Stack.cpp"
using namespace std;
int main() {
Stack<string> s1;
s1.Push("values1");
s1.Push("values2");
s1.Print();
Stack s2;
s2.Push("values1");
s2.Push("values2");
s2.Print();
}
默认模板参数呢?
template<typename T = std::string>
class Stack {
无论如何,与
Stack<T> s1;
和
Stack s2;
您没有使用不同的构造函数;在这两种情况下,您都使用相同的默认(无参数(构造函数。
与其模板化所有内容,不如使用变体类型的堆栈(从 C++17 开始,在使用 Boost.Variant 之前(。 使用下面的代码,您现在可以将int
、double
和 std::string
推送到堆栈上。 此外,Pop()
缺少返回语句。 此外,向量pop_back()
不返回任何内容。
#include <iostream>
#include <vector>
#include <string>
#include <variant>
class Stack {
using Variant = std::variant<int,double,std::string>;
public:
Stack();
void Push(Variant val);
void Pop();
void Print();
private:
std::vector<Variant> vecT;
};
Stack::Stack() : vecT() {}
void Stack::Push(Variant val) { vecT.push_back(val); }
void Stack::Pop() { vecT.pop_back(); }
void Stack::Print() {
std::cout << "[ ";
for ( auto const& v : vecT )
std::visit([] (auto&& arg) { std::cout << arg << " "; }, v);
std::cout << "]n";
}
int main() {
Stack s1;
s1.Push("values1");
s1.Push("values2");
s1.Print();
Stack s2;
s2.Push("values1");
s2.Push("values2");
s2.Print();
}
使用Boost.Variant ,您可以获得兼容C++98的解决方案。
#include <iostream>
#include <vector>
#include <string>
#include <boost/variant.hpp>
class Stack {
typedef boost::variant<int,double,std::string> Variant;
typedef std::vector<Variant>::iterator Iterator;
std::vector<Variant> vecT;
struct visitor : public boost::static_visitor<void>
{
template < typename T >
void operator()(T const& arg) const { std::cout << arg << " "; }
};
public:
Stack();
void Push(Variant val);
void Pop();
void Print();
};
Stack::Stack() : vecT() {}
void Stack::Push(Variant val) { vecT.push_back(val); }
void Stack::Pop() { vecT.pop_back(); }
void Stack::Print() {
std::cout << "[ ";
for ( Iterator it = vecT.begin(); it != vecT.end(); ++it )
boost::apply_visitor( visitor(), *it );
std::cout << "]n";
}
int main() {
Stack s1;
s1.Push("values1");
s1.Push("values2");
s1.Print();
Stack s2;
s2.Push("values1");
s2.Push("values2");
s2.Print();
}
您可以使用默认模板参数:
template<typename T = int>
class Stack {
然后,您可以使用以下方法进行构造:
Stack<> s2;
此外,构造函数是相同的,您不是每次都调用不同的构造函数,而是模板参数不同。