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;
}
4

1 に答える 1

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';
}

オンラインデモ

于 2012-07-17T23:21:22.237 に答える