传入模板类

Passing in a Template Class

本文关键字:      更新时间:2023-10-16

我正在设计一些东西来从表达式中执行运算符,因此例如(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()方法。

相关文章:
  • 没有找到相关文章