これは this SO questionの変形です。オーバーロードされた関数のランタイム特化
struct mystruct {
auto f (int x, int y) -> int;
auto f (std::string x, int y) -> float;
};
そのパラメータの一つ回数を専門に自身を呼び出す必要がf
機能:私は、異なる種類のパラメータを取り、様々なタイプを返すオーバーロードされた機能を持っています。 パラメータy
を特化した関数を定義したいと思います。つまり、g(z) = f(z,y)
が必要です。戻り値の型はg
であり、固有のパラメータの型はz
ですが、どちらの場合も実装は同じです。期待通りに動作しますが、やり過ぎのようだ
template <class F1, class F2>
struct overload_set : F1, F2
{
overload_set(F1 f1, F2 f2) : F1(f1), F2(f2) {}
using F1::operator();
using F2::operator();
};
template <class F1, class F2>
overload_set<F1, F2> overload(F1 f1, F2 f2) {
return overload_set<F1, F2>(f1, f2);
};
struct mystruct {
auto f(std::string x, int y) -> float {
return y+9.3;
}
auto f(int x, int y) -> int
{
auto g = overload (
[=](int z) -> int {return f(z,y);},
[=](std::string z) -> float { return f(z,y); }
);
if (x == 0) {
std::cout << g("this string") << "\n";
return 0;
}
if (x == 1) return y;
return 7;
}
};
int main() {
mystruct h;
std::cout << h.f(1,4) << "\n";
std::cout << h.f(0,2) << "\n";
}
:私はこのような状況で見つけることができる
最高の実装では、ラムダ関数をオーバーロードされます。
#define k(z) f(z,y)
のような単純なプリプロセッサマクロも動作するようです。これを達成する良い方法はありますか?
あなたはC++ 11に制限されていますか?単純に 'auto g(auto z) - > decltype(f(z、y))'を使うのはなぜですか? –
私はそれを試して、うまくいきませんでした。答えとしてそのアプローチで動作するコードを投稿すれば、私はそれを受け入れていただきありがとうございます。 –
'y'はどこから来たのですか? – Barry