0

次の形式の問題があります。

class A {
    ...
};
template <...> class B : public A {
    ...
}

f(A*) {...}
f(C*) {...}
template <...> f(D*) {...}

問題は、関数 f を型 B* の引数で呼び出すと、ジェネリック型 D* (A または B とはまったく関係がない) が選択されることです。A*の特化を選択してほしい

私がやろうとしていることは有効ですか?もしそうなら、なぜ機能しないのですか?
ありがとう、
イアン

4

3 に答える 3

2

SFINAE を使用できます。

template<typename T>
typename boost::disable_if<boost::is_base_of<A, T>, Ret>::type
f(T*);

B(派生したすべての型だけでなく、特定の型に対してこのオーバーロードを無効にする場合は、条件としてA使用できますboost::is_same<B, T>。)

于 2012-04-12T15:30:07.783 に答える
1

あなたが何をしようとしているのかわかりません。あなたは試すかもしれません:

void f(B *b)
{
  f(dynamic_cast<A*>(b));
}

f()これにより、タイプB*resolveのパラメーターを使用しf()て、タイプのパラメーターを受け入れる最初の定義であるが呼び出されますA*。それ以外の場合、コンパイラーは、f()暗黙的な型変換が最も少ない関数を使用した呼び出しを解決します。template <typename D> void f(D*);型変換を必要としないため、より具体的な定義に一致しないすべての呼び出しをキャッチしますf()

于 2012-04-12T15:35:30.330 に答える
0

私がやりたいことは直接可能ではないようです。どうやらテンプレートの特殊化はポリモーフィズムよりも優先され、Boost または C++11 なしではそれを回避することはできません。

最後に、「f」を呼び出す前に、すべてを「A*」型にキャストするだけで問題を解決しました。

みんな、ありがとう、

于 2012-04-21T05:22:15.077 に答える