Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。引数valueがRef*の場合とそうでない場合で処理を変えたいと思っています。valueの型がint,float,double,std::string,boolなどの場合は_valueMapに格納し、Ref*の場合は_objectMapに格納するようにしたいです。}}ところがこのコードだと、RefのサブクラスであるNodeや、その他の自作クラスのポインタをvalueとして渡したときに、特殊化した関数が呼ばれず、_valueMapのほうに格納されてしまいます。関数を呼ぶときにaddValue<Ref*>とすれば大丈夫なのですが、書き忘れが怖いです。Ref*の場合とそれ以外で関数を分けるしかないのでしょうか。編集:回答ありがとうございます。Ref*の他に、TがVec2の場合の特殊化をするにはどうしたらいいのでしょうか。specializationというエラーになりました。enable_ifの条件を追加して、Vec2の場合にも非テンプレート関数を書くしかないのでしょうか。票4C++にはSFINAEという仕組みがあります。テンプレートの置き換えに失敗してもエラーにならないようにするとかなんとか。それをうまく利用するためにstd::enable_if他のテンプレートが用意されています。これらを使うと「TがRefやサブクラスの場合にはaddValue()テンプレート関数が定義されていなかったこと」にできます。その上で改めてaddValue(Ref*,)を非テンプレート関数として用意してやればいいでしょう。//}古いコンパイラーだと次のように記述する必要があるかもしれません。//}元質問はvalueの型がint,float,double,std::string,boolなどの場合は_valueMapに格納し、Ref*の場合は_objectMapに格納するようにしたいです。追加質問では逆転していて、Ref*、Vec2、Size、Rectの場合は_objectMapで、残りが_valueMapと受け取れます。あればenable_ifの型パラメーターはbool式ですので希望する式を記述すれば実現できます。個の銅バッジ回答ありがとうございます。5:07わかりにくくてすみません。Ref*、Vec2、Size、Rectのそれぞれについて、_objectMap、_vec2Map、_sizeMap、_rectMapに格納したいです。あぁすみません、コードを見れていませんでした。何であれ、必要なオーバーロードを用意していけばいいかと。constを付けたいのであればremove_constした上で比較すればいいです。質問がだんだんと変化していて当初と異なる内容が求められているように感じられます。traitsも視野に入ってきます。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。会を開催します🎉サイトの未翻訳箇所を見つけて、もくもく会で直しましょう関連する質問7可変長テンプレートの展開と引数の評価順序についての疑問。char*型の文字列をテンプレート関数で連結したい0c++でテンプレートを使ってstd::cout<<x:で画面に表示できない。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。