同じ関数の複数のオーバーロードがあります。いくつかの引数セットでは、いくつかのオーバーロードが等しくフィットし、自然に "あいまいなオーバーロード"エラーが発生します。私はあいまいさの場合に最も小さい優先順位を持つものが選択されるように、これらの関数に対する優先順位をある程度定義したいと思う。オーバーロードされた関数の手動による優先順位付け
私はテンプレートのヘルパークラスのシリーズを作ってみました、「タグ」、P<0>
、P<1>
、...、P<N>
は、いくつかの上限とP<N+1>
を継承するようになっています。したがって、2つの関数f(P<2>)
とf(P<4>)
があり、私がf(P<0>)
と呼ぶ場合、最初のものが選択されます。
実際には機能しません。古典的な "int/long"関数と "long/int"関数の "きれいな"例は、やはりあいまいさを引き起こします。私は、タグの "重み"を増やすために関数にいくつかのタグパラメータを追加しようとしましたが、それは役に立ちません。
この方法は何とか調整できますか?彼らはあなたの過負荷のための唯一のタイブレークしている場合にのみ機能します
template <int N> struct P : P<N+1> { };
template <> struct P<MAX> { };
次に、タグタイプのエスカレーター:すべての
constexpr static int MAX = 20;
template<int N, class Enable = void>
class P {};
template<int N>
class P<N, typename std::enable_if<N < MAX, void>::type> : public P<N+1> {};
void f(int, long, P<2>) {}
void f(long, int, P<5>) {}
int main() {
f(1, 2, P<0>());
}
バリアントに異なる名前を使用するだけで、明示的に必要な名前を付けることができます。 – Barmar
「N-1」継承がなぜ必要なのですか?テンプレートクラスP {}; ' –
ciechowoj
@Barmar実際にこれらの関数はテンプレートであり、この種のロジックで生成されているので、「すべてのベクトルに対して関数を作成する」、「すべてのSTLコンテナに対して関数を作成する"、"すべてのシリアライズ可能な型の関数を作る "などがあります。また、1つの型に対して、いくつかの関数を生成することができます。 –