gpt4 book ai didi

c++ - 将类对象传递给模板函数。 C++

转载 作者:太空宇宙 更新时间:2023-11-04 15:34:44 25 4
gpt4 key购买 nike

我有一个模板函数定义如下:

template<class T>
string toString(T value) {

ostringstream ss;

if (is_same<T, Student>::value) {
ss << value.getFirst() << ":" << value.getLast() << ":" << value.getId() << ":" << value.getGpa();
return ss.str();
}

else {
//ss << value;
return ss.str();
}
}

如果我像这样调用这个函数:

int main(){

Student studentObj;
toString(studentObj);

}

我如何从 toString 函数访问这个类的各种成员?

我试过了(错误评论)

value.getId() //Returns int 
//Error C2228 left of '.getId' must have class/struct/union

value<Student>.getId()
//Error C2275 'Student': illegal use of this type as an expression

提前致谢!

编辑:类定义

class Student {
protected:
std::string firstname;
std::string lastname;
int id;
float gpa;
public:
Student();
Student(std::string, std::string, int, float);
Student(const Student &);
std::string getFirst();
std::string getLast();
int getId();
float getGpa();
};

最佳答案

没有。你不能这样做。对于任何非 Student 的模板代码编译的第二阶段输入 if部分将无法编译。不是那个if是运行时,不是编译时,即使 std::is_same是编译时间。当您将其称为 toString(10) 时编译器仍然需要为 int 编译它完全 .它不会评估运行时 if声明并删除 if (true) block - 编译器仍然需要编译它,并为它生成目标代码。因此错误。

您只需要专门化它:

template<class T>
string toString(T value)
{
ostringstream ss;
/// skipped code
return ss.str();
}

// SPECIALIZE for 'Student'
template<>
std::string toString(Student s)
{
// Code here
}

添加const和/或 &如果你愿意的话。

关于c++ - 将类对象传递给模板函数。 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37296540/

25 4 0
文章推荐: c++ - 在 C++ 项目中包含 dlib 库时出错
文章推荐: css - 文档类型和章节
文章推荐: html - 在无序列表中定位
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com