2012-07-17 111 views
1

像這樣使用模板可能嗎?班級成員的模板參數

template<class T, int T::M> 
int getValue (T const & obj) { 
    return obj.M; 
} 

class NotPlainOldDataType { 
public: 
    ~NotPlainOldDataType() {} 
    int x; 
} 

int main (int argc, char ** argv) { 
    typedef NotPlainOldDataType NPOD; 
    NPOD obj; 

    int x = getValue<NPOD, NPOD::x>(obj); 

    return x; 
} 

我已經知道如何做到這一點使用宏

#define GET_VALUE(obj, mem) obj.mem 

class NotPlainOldDataType { 
public: 
    ~NotPlainOldDataType() {} 
    int x; 
} 

int main (int argc, char ** argv) { 
    NotPlainOldDataType obj; 

    int x = GET_VALUE(obj, x); 

    return x; 
} 

回答

7

如果我正確理解你的意圖,那麼下面應該工作:

#include <iostream> 

template<typename T, int (T::*M)> 
int getValue(T const& obj) 
{ 
    return obj.*M; 
} 

class NotPlainOldDataType 
{ 
public: 
    explicit NotPlainOldDataType(int xx) : x(xx) { } 
    ~NotPlainOldDataType() { } 
    int x; 
}; 

int main() 
{ 
    typedef NotPlainOldDataType NPOD; 

    NPOD obj(3); 
    std::cout << getValue<NPOD, &NPOD::x>(obj) << '\n'; 
} 

Online demo