2016-05-10 7 views
9

reinterpret_castを使用して、同じクラスの別のポインタへのメンバ関数にメンバ関数へのポインタをキャストすることは合理的ですか?次の例は動作します。しかしそれは合法ですか? [expr.reinterpret.cast] C++ドラフト状態で同じクラスの別のものに1つのポインタ関数へのキャスト

#include<iostream> 
#include<vector> 
#include<string> 

class A 
{ 
    public: 
    void func_int(int x) { std::cout << x << std::endl; } 
    void func_string(std::string const& x) { std::cout << x << std::endl; } 
}; 

int main() 
{ 
    std::vector<void(A::*)()> v; 
    v.push_back(reinterpret_cast<void(A::*)()>(&A::func_int)); 
    v.push_back(reinterpret_cast<void(A::*)()>(&A::func_string)); 
    A a; 
    (a.*reinterpret_cast<void(A::*)(int)>(v[0]))(5); 
    (a.*reinterpret_cast<void(A::*)(std::string const&)>(v[1]))(std::string{"Test"}); 

    return 0; 
} 

答えて

10

「タイプ T1Xのメンバーへのポインタ」型のprvalueは明示のメンバーに異なるタイプ「ポインタのprvalueに変換することができる

T1およびT2が両方とも機能型または両方のオブジェクト型である場合は、T2Yです。 nullメンバー・ポインタ値([conv.mem])は、宛先タイプのNULLメンバー・ポインタ値に変換されます。この変換の結果は、以下の場合を除いて、不特定である:

  • メンバ関数型に異なるポインタに「メンバ関数へのポインタ」型のprvalueを変換して元の形には、元のポインタを与えますメンバーの価値に

  • 「タイプT2Yのデータメンバへのポインタ」型の「タイプT1Xのデータメンバへのポインタ」型のprvalue変換(T2の位置合わせ要件がT1のものよりも厳しくない場合)元の型に戻って元のメンバー値へのポインタを返します。

72)T1T2

reinterpret_castはconst性を離れてキャストすることができない全体的な制限を受ける異なる CV -qualifiersを有していてもよいです。

"メンバー関数へのポインタ"を別の "メンバー関数へのポインタ"型に変換して戻すので、元の値が返されます。これは合法でよ​​く定義された動作です。したがって、コードは適切に動作するはずです。

関連する問題