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

时间:2016-05-18 10:12:43

标签: c++ class templates

我的模板函数定义如下:

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();
};

2 个答案:

答案 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