8

フィールド名を関数テンプレートに渡す方法があるかどうか疑問に思っています。次の点を考慮してください。

struct Type1{
    unsigned int Field1;
    unsigned int Field2;
};

struct Type2{
    unsigned int Field2;
    unsigned int Field3;
};

template <typename TYPE>
bool MyFunction(TYPE _Type){
    if(_Type.Field1==5)
        return false;
}

これは正常に機能しますが、MyFunction指定.Field1している範囲内で、このフィールドの名前をテンプレートに渡す方法はありますか。たとえば、次のようになります。

void TestFunction(){
    Type1 mt1;
    MyFunction(mt1, Field1);
}

明らかに、私はここで型をテンプレート化しているわけではなく、これが何と呼ばれるかについて途方に暮れています (明白な答え以外は-ばかげています!) ので、解決策を探すのに苦労しています.

4

2 に答える 2

13

名前は C++ メタモデルの一部ではないため 、純粋な名前を渡すことはできませんが、メンバーへのポインターを関数に渡すことができます。

template <typename TYPE, typename T>
bool MyFunction(TYPE obj, T TYPE::*mp)
//                          ^^^^^^^^^
{
    if ((obj.*mp) == 5)
//          ^^^^
        return false;

    // ... <== DON'T FORGET TO RETURN SOMETHING IN THIS CASE,
    //         OTHERWISE YOU WILL GET UNDEFINED BEHAVIOR
}

これを小さな完全なプログラムで使用する方法を次に示します。

struct Type1{
    unsigned int Field1;
    unsigned int Field2;
};

struct Type2{
    unsigned int Field2;
    unsigned int Field3;
};

int main()
{
    Type1 t1;
    Type2 t2;
    MyFunction(t1, &Type1::Field1);
    MyFunction(t2, &Type2::Field3);
}

そして、これがライブの例です。

于 2013-03-09T18:47:00.023 に答える
5

メンバーへのポインタを渡すことができます:

template <typename T>
bool MyFunction(T& type, int T::*field){
    if (type.*field == 5)
        return false;
}

MyFunction(mt1, &Type1::Field1);
于 2013-03-09T18:46:45.437 に答える