gpt4 book ai didi

c++ - 消除模板类不需要的大小写

转载 作者:行者123 更新时间:2023-11-28 06:03:42 25 4
gpt4 key购买 nike

我使用模板类类型数据类型作为类方法的参数。在那种方法中,我正在计算参数的差异并将其打印出来。这只是实际项目中的示例代码。

Header.h

#ifndef Header_h
#define Header_h

#include <iostream>
#include "string.h"

template <class T>
class Student
{
public:
Student(T);
void calcDifference(int idx, T val1, T val2);

};
#endif

main.cpp

#include <iostream>
#include "Header.h"

using namespace std;

template <class T>
void Student<T>::calcDifference(int idx, T val1, T val2)
{
T difference = val1 - val2;
cout<<"\nDifference values: "<<difference<<endl;

}

template <class T>
Student<T>::Student(T)
{
cout<<"constructor called";
}


int main(int argc, const char * argv[])
{

Student<int> oStudent(10);
oStudent.calcDifference(1, 12, 10);


//THIS FOLLOWING OBJECT CREATES ERROR BECAUSE IT IS TRYING TO PASS STRING TYPE
Student<string> o2_Student("hi");
o2_Student.calcDifference(1, "aaa", "aa");

return 0;
}

问题:因为,我正在尝试计算 calcDifference() 中参数之间的差异,main() 中的第二个对象试图传递字符串会产生问题。这是因为不能对字符串进行差分操作(至少不能直接进行)。

错误: /Users/siddharth/coding/cplusplus/xCode/CPPCodes/InterviewTest/InterviewTest/main.cpp:9:26: Invalid operands to binary expression ('std::__1::basic_string<char>' and 'std::__1::basic_string<char>')

我需要什么:我希望代码保持通用(对于我无法准确更改的调用函数)。我想找到一些解决方案,这样我就不会得到这个编译器错误,如果传递的参数是字符串类型,那么 calcDifference()应该打印一条语句(如“不允许使用字符串数据类型”)并返回到调用函数。我可以在 calcDifference() 中进行更改ONLY 因为在实际项目中我无法控制调用函数。我认为异常处理在这种情况下无济于事,因为它有助于捕获运行时错误,但在这种情况下,我收到编译时错误,因为调用函数试图传递字符串(模板 T 是字符串)。

PS: 我无法对这个结构进行任何更改,这意味着我什至无法更改参数的数量等。我只能在方法内部进行更改 calcDifference() .

最佳答案

线

T difference  = val1 - val2;

val1 - val2 没有为类型定义时会出现问题。当 T = std::string 时就是这种情况。这就是编译器所提示的。

解决该问题的一种方法是使用帮助程序 struct 模板,该模板适用于使用通用逻辑的大多数类型,但允许您将其专门用于 val1 - val2 的类型 未定义。

定义一个助手 struct

template <typename T> struct difference
{
T operator()(T val1, T val2) const { return val1 - val2; }
};

而不是使用

T difference  = val1 - val2;

使用

T diff  = difference<T>()(val1, val2);

std::string 专门化 difference

template <> struct difference<std::string>
{
std::string operator()(std::string const& val1,
std::string const& val2) const
{
// Figure what it means to compute the difference
// between two strings for your application.
return stringDifference(val1, val2);
}
};

关于c++ - 消除模板类不需要的大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32802327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com