web-dev-qa-db-ja.com

C ++で別の関数の宣言の引数として関数の戻り値の型を使用することは可能ですか?

私はこのようなものが欲しい:

std::Tuple<int, bool, double> MyFunction_1 (void);

void MyFunction_2 (decltype (MyFunction_1) &params);

明らかに、この例では、関数へのコードポインターが渡されます。

これと同等のものが欲しい:

void MyFunction_2 (std::Tuple<int, bool, double>  &params);

そうすることは可能ですか?

31

decltype (MyFunction_1)は_MyFunction_1_の型(つまり、関数型std::Tuple<int, bool, double> ())を提供します。関数呼び出しをエミュレートする 1 (_()_を追加して、戻り値の型(_std::Tuple<int, bool, double>_)を取得します。

_void MyFunction_2 (decltype (MyFunction_1()) &params);
//                                       ^^
_

1 式はコンパイル時に評価され、関数は実際には実行時に呼び出されません。

35
songyuanyao

_MyFunction_1_のtypeは_std::Tuple<int, bool, double>_ではありません-非公式には関数ポインターと考えることができます。実際、_&MyFunction_1_ decays自身に対して確かにポインターです。

したがって、decltype(MyFunction_1)はあなたが望むものではありません。

解決策はdecltype(MyFunction_1())を書くことです。 type of MyFunction_1()is _std::Tuple<int, bool, double>_。これは実際にはcall関数ではないことに注意してください。その点では、むしろsizeofに似ています。

16
Bathsheba
using RetType = std::invoke_result<decltype(f)>::type;

それで遊ぶ: https://gcc.godbolt.org/z/AE7lj_

3
jf12