2016-05-18 3 views
0

У меня есть шаблон функция определяется следующим образом:Передача объекта класса в функцию шаблона. C++

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

Что такое 'значение'? – Rakete1111

+0

строка 2: строка toString (значение T). Значение - это просто имя того, что когда-либо передается в класс. – Cirrus

+1

Это не тип, вы не можете этого сделать. Удалите часть '', это только для объявления – Rakete1111

ответ

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 и/или &, если вы хотите.

+0

Спасибо за объяснение и пример! – Cirrus

+0

Это случай, когда [перегрузка должна быть предпочтительнее специализации] (http://www.gotw.ca/publications/mill17.htm). – Quentin

0

Чтобы получить доступ к функциям-членам класса через функцию шаблона, попробуйте позвонить по этому пути.

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 
+0

Добро пожаловать в StackOverflow, vasant. Но это не решает проблему. – Ajay

Смежные вопросы