関数を演算子に渡す必要があります。正しい arg 型を持つ任意の単項関数。戻り値の型は何でもかまいません。f
これはライブラリ コードであるため、ラップしたり、特定のオーバーロード (の外部) にキャストしたりすることはできませんoperator*
。関数はoperator*
、それ自身の引数として 1 番目の引数を取ります。以下の人為的な例は、コンパイルして正しい結果を返します。int
ただし、この例をコンパイルするために、戻り値の型がハードコーディングされています。
#include <tuple>
#include <iostream>
using namespace std;
template<typename T>
int operator* (T x, int& (*f)(T&) ) {
return (*f)(x);
};
int main() {
tuple<int,int> tpl(42,43);
cout << tpl * get<0>;
}
任意の戻り値の型でoperator*
受け入れるようにすることはできますか?f
更新 - GCC バグ? コード:
#include <tuple>
template<typename T, typename U>
U operator* (T x, U& (*f)(T&) ) {
return (*f)(x);
};
int main() {
std::tuple<int,int> tpl(42,43);
return tpl * std::get<0,int,int>;
}
gcc462 および 453 では正しくコンパイルおよび実行されますが、gcc471 および 480 では拒否されます。したがって、GCC リグレッション バグの可能性があります。バグレポートを提出しました: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54111
編集 タプルを引数として使用するように例を変更しました-前の例では戻り値の型を自明に推測できました。
EDIT2
多くの人が何が必要なのか理解できなかったので、例をより現実的にするためにcall
機能を変更しました。operator*