19

aが と のclass A2 つの概念を満たすConceptAとしConceptBます。foo2 つの概念のために関数をオーバーロードします。

void foo(ConceptA& arg);
void foo(ConceptB& arg);
A a;
fun(concept_cast<ConceptA>(a));

注: この例では、 N3701、 §5の一部として提案されている「Terse Notation」構文を使用しています。

concept_castユーザーがオーバーロードを選択できるようなものはありますか?

例: ConceptAT にはメンバー関数が必要であり、bar() ConceptBT にはメンバー関数が必要baz() であり、とメンバー関数class Aの両方があるとします。bar()baz()

static_cast明らかにあいまいですが、通常のオーバーロードのように明示的に選択する方法はありますか?

更新:受け入れられた回答は2年以上前のものです。c++17 の更新はありますか?

4

2 に答える 2

4

概念の 1 つが他の概念のより制約されたバージョンである場合 (たとえば、満たすものはすべてConceptA満たすConceptBが、その逆は満たさない)、A満たす最も制約の多いオーバーロードが選択されます。

どちらの概念も他方よりも制約されていない場合、2 つの概念はあいまいなオーバーロードであると見なされます。あなたが質問をどのように表現したかを考えると、あなたはすでにこれを知っていると思います.

についてconcept_castは、現在の提案ではそのようなことはないと思います。少なくともブリストル会議 (2013 年 4 月) の時点ではそうではありません。現在の焦点は、concepts-lite/constraints 提案のコアが実行可能であり、委員会に受け入れられることを確認することにあるように思われるため、これが変更されることはないと思います。

おそらく、そのようなオーバーロードされたテンプレート関数を明示的に選択する必要があり、おそらくそのようなキャストは正しいことですが、よくわかりません. このようなキャストは、より一般的な機能である as のオーバーロードの明確化にのみ役立つと考えてください。static_castの結果は、concept_castオーバーロード解決のコンテキスト外では元の値と同じになります!

編集:最新の提案 ( N3701 ) を見ると、インスタンス化するテンプレート関数を明示的に指定する規定はありません。

于 2013-09-06T21:40:15.350 に答える