2012-09-08 54 views
2
#include <iostream> 
#include <string> 

using namespace std; 

struct Uid { 
    typedef int type; 
}; 

struct Name { 
    typedef string type; 
}; 


struct Age { 
    typedef int type; 
}; 


template <class T1, class T2, class T3> 
class People { 
private: 
    typename T1::type val1; 
    typename T2::type val2; 
    typename T3::type val3; 
    //add a get function here 
    } 
}; 


int main() { 
    People<Uid, Name, Age> people; 
    people.get<Uid>(); //make this validate 
} 

這是我的代碼,我想在類中添加一個get函數,以使函數調用get in main validate。 我嘗試在類中添加一個tempalte get和它的專業化版本,但它是一個無效的方法,編譯器說:顯式專用於非命名空間範圍'class People'。有人說這種方法適用於vs,但它破壞了標準。如何在類中使用成員函數專業化?

+0

這適用於我:http://ideone.com/IVqss –

回答

5

您需要一個模板化get()成員函數可以使用的幫助器類。該助手類可以在命名空間範圍內。

#include <iostream> 
#include <string> 

using std::string; 
using std::cout; 

struct Uid { 
    typedef int type; 
}; 

struct Name { 
    typedef string type; 
}; 

struct Age { 
    typedef int type; 
}; 

// Helper class that can be specialized to get different members of People. 
template <class P, class U> struct PeopleGet; 


template <class T1, class T2, class T3> 
class People { 
public: 
    People(
    typename T1::type const& val1, 
    typename T2::type const& val2, 
    typename T3::type const& val3 
) 
    : val1(val1), 
    val2(val2), 
    val3(val3) 
    { 
    } 

    template <class U> typename U::type get() 
    { 
    return PeopleGet<People<T1,T2,T3>,U>::get(*this); 
    } 
private: 
    typename T1::type val1; 
    typename T2::type val2; 
    typename T3::type val3; 

    template <class P,class U> friend class PeopleGet; 
}; 


template <class T1,class T2,class T3> 
struct PeopleGet<People<T1,T2,T3>,T1> { 
    static typename T1::type get(const People<T1,T2,T3> &people) { return people.val1; } 
}; 

template <class T1,class T2,class T3> 
struct PeopleGet<People<T1,T2,T3>,T2> { 
    static typename T2::type get(const People<T1,T2,T3> &people) { return people.val2; } 
}; 

template <class T1,class T2,class T3> 
struct PeopleGet<People<T1,T2,T3>,T3> { 
    static typename T3::type get(const People<T1,T2,T3> &people) { return people.val3; } 
}; 


int main() 
{ 
    People<Uid, Name, Age> people(5,"name",47); 
    cout << people.get<Uid>() << "\n"; 
    cout << people.get<Name>() << "\n"; 
    cout << people.get<Age>() << "\n"; 
    return 0; 
}