私はこのようなものが欲しい:
std::Tuple<int, bool, double> MyFunction_1 (void);
void MyFunction_2 (decltype (MyFunction_1) ¶ms);
明らかに、この例では、関数へのコードポインターが渡されます。
これと同等のものが欲しい:
void MyFunction_2 (std::Tuple<int, bool, double> ¶ms);
そうすることは可能ですか?
decltype (MyFunction_1)
は_MyFunction_1
_の型(つまり、関数型std::Tuple<int, bool, double> ()
)を提供します。関数呼び出しをエミュレートする 1 (_()
_を追加して、戻り値の型(_std::Tuple<int, bool, double>
_)を取得します。
_void MyFunction_2 (decltype (MyFunction_1()) ¶ms);
// ^^
_
1 式はコンパイル時に評価され、関数は実際には実行時に呼び出されません。
_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
に似ています。
using RetType = std::invoke_result<decltype(f)>::type;