2017-11-24 12 views
3

のオブジェクト上のベースクラスのメンバ関数へのポインタを使用すると、コードスニペットを次の検討:派生クラス

struct Base { 
    std::string foo() const { std::cout << "Base::foo()\n"; return "X"; } 
}; 

struct Der : Base {}; 

struct Ptr : std::integral_constant<std::string (Base:: *)() const, &Base::foo> {}; 

および使用のようである:所望のよう

Der der; 
std::string s = (der.*Ptr::value)(); 
std::cout << s << "\n"; 

出力は:

Base::foo() 
X 

すべてうまくいくようです。

私の質問はこのコードは正しいですか?あるいは、私は未定義の行動の土地を歩いていますか?派生クラスのオブジェクトの基底クラスのメンバ関数へのポインタを直接使用できますか?

+2

前に 'std :: integral_constant'にポインタを格納することを考えていませんでした。それは面白いアプローチです。 –

+0

@FrançoisAndrieux私の質問のその部分が他の人に役立つことを聞いてよかった:) –

答えて

3

メンバーはサブジェクトに属しているため、そのタイプを使用して識別する必要があります。確かに完璧に良い。

他の方法は、周りにも、実際にはコンパイルされません:

struct Ptr : std::integral_constant<std::string (Der:: *)() const, &Der::foo> {}; 

を誤差はかなり明確である:私はそれを少し減らすために[...]を使用

error: could not convert template argument '&Base::foo' from '[...] (Base::)() const}' to '[...] (Der::)() const'

+0

はい、私はあなたが投稿したものを試してみました。それが基本クラスについての私の質問の理由です:)とにかく感謝 –