传入模板类
Passing in a Template Class
我正在设计一些东西来从表达式中执行运算符,因此例如(3 + 5),将读取字符串,并计算并返回表达式。现在我得到了正确的输出,我的问题是我以三种不同的方式实现了堆栈,链表、矢量和动态数组,现在它们都有相同的方法名称,推送和弹出尊重只是不同的实现。现在我为它们中的每一个都有一个函数,所以我得到了:
void doVectorOp(V_H<int> value, V_H<char> op){//my personal vector class for stack
//do something
}
void doDynamicOp(D_H<int> value, D_H<char> op){
//do something
}
void doLinkedOp(SLL<int> value, SLL<char> op){
//do something
}
现在这三个函数具有完全相同的代码并执行相同的操作,但是使用不同的类类型,我可以将所有这些函数简化为一个吗?像这样:
void doOp(Generic class<int> value, Generic class<char> op){
//do something
}
谢谢 陈云飞
您可以使用模板模板参数,如以下示例所示。可以在此处找到语法说明。
template < typename T >
struct V_H
{
void push() { std::cout << "V_H push" << std::endl; }
void pop() { std::cout << "V_H pop" << std::endl; }
};
template < typename T >
struct D_H
{
void push() { std::cout << "D_H push" << std::endl; }
void pop() { std::cout << "D_H pop" << std::endl; }
};
template < typename T >
struct SLL
{
void push() { std::cout << "SLL push" << std::endl; }
void pop() { std::cout << "SLL pop" << std::endl; }
};
template < typename VAR_TYPE, template<typename> typename CLASS_TYPE >
void doOp( CLASS_TYPE<VAR_TYPE>& value, CLASS_TYPE<VAR_TYPE>& op){
value.pop();
value.push();
}
int main()
{
V_H<int> vh;
D_H<float> dh;
SLL<double> sll;
doOp( vh, vh );
doOp( dh, dh );
doOp( sll, sll );
}
但是在 C++20 中您可以编写要容易得多:
void doOp( auto& value, auto& op)
{
value.pop();
value.push();
}
但是现在你可以把几乎所有的东西传递给你的模板化函数(它只是通过使用auto
关键字进行模板化),这可能会导致难以阅读的错误。因此,由于 C++20 可用,您可以使用以下"概念":
void doOp( auto& value, auto& op)
requires requires // duplicated requires keyword for ad hoc requierement
{
value.push();
value.pop();
}
{
value.pop();
value.push();
}
它只是告诉编译器,你传递的类型必须有一个pop()
和一个pull()
方法。
相关文章:
- 没有找到相关文章