2016-10-06 12 views
1

同じ関数の複数のオーバーロードがあります。いくつかの引数セットでは、いくつかのオーバーロードが等しくフィットし、自然に "あいまいなオーバーロード"エラーが発生します。私はあいまいさの場合に最も小さい優先順位を持つものが選択されるように、これらの関数に対する優先順位をある程度定義したいと思う。オーバーロードされた関数の手動による優先順位付け

私はテンプレートのヘルパークラスのシリーズを作ってみました、「タグ」、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>()); 
} 
+2

バリアントに異なる名前を使用するだけで、明示的に必要な名前を付けることができます。 – Barmar

+0

「N-1」継承がなぜ必要なのですか?テンプレートクラスP {}; ' – ciechowoj

+0

@Barmar実際にこれらの関数はテンプレートであり、この種のロジックで生成されているので、「すべてのベクトルに対して関数を作成する」、「すべてのSTLコンテナに対して関数を作成する"、"すべてのシリアライズ可能な型の関数を作る "などがあります。また、1つの型に対して、いくつかの関数を生成することができます。 –

答えて

6

まず、次のような自分のタグタイプの構成を簡略化することができます。つまり、タグ引数を除いて、他のすべての引数は同等です。

f(int, long, P<2>); // #1: Exact, Integral Conversion, P<0> -> ... -> P<2> 
f(long, int, P<5>); // #2: Integral Conversion, Exact, P<0> -> ... -> P<2> -> ... -> P<5> 

一つの過負荷が引数に、変換シーケンスは、少なくとも同じくらい良いですが、もし別の過負荷よりも唯一の優れている:あなたの通話はまだあいまいである理由は、あなたがで終わる変換シーケンスであるということですもう一方のオーバーロードの引数の変換シーケンス。これはここでは当てはまりません。#1は第1引数では良く、第2引数では#2より悪いです。別の議論を加えてもその欠陥は変わらない。

template <class T, std::enable_if_t<cond_a<T>::value>* = nullptr> 
void f(T&&, P<0>) { ... } 

template <class T, std::enable_if_t<cond_b<T>::value>* = nullptr> 
void f(T&&, P<1>) { ... } 

template <class T, std::enable_if_t<cond_c<T>::value>* = nullptr> 
void f(T&&, P<2>) { ... } 

f(whatever, P<0>{}); 

cond_acond_b、およびcond_cは互いに素である必要はなく、すべてのケースでは、最初の引数は同じです:あなたは非互いに素な条件でSFINAEを使用している場合、タグタイプが便利です

です。 SFINAEによって削除されていないオーバーロードのために最終的なタイブレイカーがタグになります。

+0

ええと、これらの日にenable_ifで本当にたくさん働いていて、タグのための簡単な解決策を覚えていませんでした:)ありがとう、私は、それぞれの議論のためにシーケンスが良くなるはずです。総換算コスト "となる。そしてあなたの解決策は私の問題に完全に合っています。私はその質問を過度に複雑にしたようです。 –

関連する問題