我的模板函数定义如下:
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();
};
答案 0 :(得分:5)
没有。你不能这样做。对于任何非Student
类型的模板代码编译的第二阶段,if
部分将无法编译。并非if
是运行时,而不是编译时,即使std::is_same
是编译时。当您将其称为toString(10)
时,编译器仍然必须为int
编译完全。它不会评估运行时if
语句并消除if
(true)块 - 编译器仍然必须 编译 它,并生成它的目标代码。因而错误。
您只需要专门化:
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
和/或&
。
答案 1 :(得分:1)
要通过模板函数访问类的成员函数,请尝试以这种方式调用。
Student studentobj;
std::string temp = toString<Student>(studentobj); // This will invoke the member functions of student class
// Code snippet similar to your query
class test
{
public:
test(){}
void callme()
{
std::cout<<"In callme function"<<std::endl;
}
};
template<class T>
void sample(T obj)
{
std::cout<<"In sample function"<<std::endl;
obj.callme();
}
int _tmain(int argc, _TCHAR* argv[])
{
test obj;
sample<test>(obj);
return 0;
}
Output:
In sample function
In callme function