インスタンス化される関数の戻り値の型をパラメータとして取得するテンプレートを作成したいと思います。"現在の関数"の戻り値の型を取得する方法はありません
例えば、私はResult
テンプレートクラスをしましたと仮定します。
template<type T>
class Result {
T _result_value;
T& operator=(T that);
~Result();
}
このクラスにはいくつかの専門分野があるでしょう。デストラクタでは戻り値の型をログに記録したいと思います。operator=
割り当て内でエラー値を確認してアサートしたいと思います。
理想的には、私が持ってできるようにしたいと思い、このような定義:
#define RESULT Result< /* decltype magic for type of current function */ >
はので、私はそれを使用することができます:
Result<HFILE>
に推測されます
HFILE MyOpenFile(...) {
RESULT result;
}
...。これは単純な例です。Result<HFILE>
の代わりにRESULT
を書くことは大したことではありませんが、現在の関数の戻り値の型が簡単に得られないシナリオがあります。
あなたはhttp://en.wikipedia.org/wiki/Decltypeを使用することができますか? – bobah
少なくとも、関数名をマクロに渡す必要があります(例えば、 'RESULT(MyOpenFile)')、オーバーロードの場合でも、あいまいさに遭遇します。 [現在の関数へのポインタを取得しています](http://stackoverflow.com/q/2154852/1468366)でも、やり直しが難しく、正しい型付きのポインタを取得することは、関数の名前を変更しなければ不可能に見えます。 – MvG
@MvGを使用すると、 'decltype'に関数+ paramsを渡すことでオーバーロードのあいまいさを回避できます。 'decltype(foo(b))'、 'decltype(foo(a、b))'は正しく解決されます。しかし、それは痛みです。 – Nim