の型をnullptr与える次のスニペットを仮定しますテンプレート控除
template <class T>
void fct(T* a, T* b){
// do something
}
A a;
fct(&a, nullptr); // Problem here!
コールの引数の型A*
とnullptr_t
のものであり、そのコンパイラはテンプレートパラメータT
を推測することはできませんので、これは、トラブルになります。
fct(&a, static_cast<A*>(nullptr))
A* b = nullptr
を定義し、
nullptr
ケース
fct(&a, b)
fct
のために一つの引数でオーバーロードを定義して使用します。 一般的に、私はどのようにこれを解決するには、いくつかのアイデアを想像することができます
もっと清潔な解決策がありますか、li "型付きnullptr"のようなものの作成
template <class T, class U>
void fct(T* a, U b){
T* b2 = b;
// do something
}
A a;
fct(&a, nullptr);
これはfct
の広い使い方が可能になりますが、多分それはあなたがしたいまさにそれだ:
希望する「型付きnullptr」は、「static_cast (nullptr)」と異なる場合がありますか? – Petr
あなたの2番目の選択肢はベストベットのようです...オーバーロード(テンプレートの特殊化) – basav
あなたはすでに質問に答えています... 1番目と3番目の選択肢は多かれ少なかれ同じです:T *とnullptrは必要ありません。 fct(&a、nullptr) '、2ndはそれを可能にするために明示的なオーバーロードを使います。私は別の答えを想像することはできません... –