2017-10-24 8 views
1

この定義の意味を教えてください。私はこれを、パラメータargsで関数を呼び出し、返された結果をT型にキャストするタスク構造のオーバーロードされたテンプレート関数とみなします。オーバーロードされたオペレータとして機能するラッパー

template <class T> 
struct Task 
{ 
    template <typename ...Args> 
    void operator()(const Args&... args) 
    { 
     (*static_cast<const T*>(this))(args...); 
    } 
}; 

どうすればよいですか?私のためには、それは非常に過剰に見えます。

+1

そうすることのポイントは、最初は誰も書いてはいけない醜いタイプセーフなC++コードを実装することです。それ以上の説明は必要ありません。 –

+2

'this'は関数ではありません – Slava

+0

はい、これはメンバ関数が呼び出されているオブジェクトのアドレスです。しかし、これは私をさらに混乱させます。 – DzikiChrzan

答えて

2

このコード:

(*static_cast<const T*>(this))(args...); 

は、論理的に等価である:

const T *ptr = static_cast<const T*>(this); 
const T &ref = *ptr; 
ref(args...); 

私はそれはあなたが考えるように、その文が(それは関数呼び出しから返された値をキャストしないん今何明確にするべきだと思います)

+0

これは確かに読みやすくなっています。したがって、 'operator()'を呼び出すと、オブジェクトへのポインタが作成され、次に参照呼び出しによって 'operator()'がオーバーロードされます。しかし、それ自体の反復呼び出しではありませんか? {template void operator()(const Args &...); /*...*/};これは、タスクの代わりに静的型の 'T'を使用していますので、 – DzikiChrzan

+0

です。 ' – Jarod42

+1

ポインタを作成せず、' this'を 'const T *'にキャストするので、 'T'は' Task ' – Slava