メタプログラミング: 型の可用性に基づいた関数定義の推論
テンプレート メタプログラミングのコンテキストでは、特定の基準に基づいてテンプレートを定義することが必要になります。 。この特定のシナリオの目的は、オーバーロードされた to_string 関数が特定の型に対して定義されているかどうかに基づいて実装を選択するテンプレートを定義することです。
最初の試みは、選択基準として is_arithmetic を使用することでした。
template<typename T> enable_if_t<is_arithmetic<T>::value, string> stringify(T t){ return to_string(t); }
ただし、to_string は非算術型では使用できない場合があるため、追加のtemplate:
template<typename T> enable_if_t<!is_arithmetic<T>::value, string> stringify(T t){ return static_cast<ostringstream&>(ostringstream() << t).str(); }
to_string が利用できない場合のテンプレート選択基準を定義する際に課題が発生しました。次の試みは失敗しました:
template<typename T> enable_if_t<!decltype(to_string(T{})::value, string> (T t){ return static_cast<ostringstream&>(ostringstream() << t).str(); }
この問題を解決するには、Walter Brown によって導入された void_t 型特性を利用できます。これにより、関数の存在をチェックする型特性を定義できます。
template <typename...> using void_t = void;
これを使用すると、目的のタイプ特性を次のように構築できます。以下:
template<typename T, typename = void> struct has_to_string : std::false_type { }; template<typename T> struct has_to_string<T, void_t<decltype(std::to_string(std::declval<T>()))> > : std::true_type { };
この型特性を使用すると、後で to_string:
template<typename T> auto stringify(T t) -> std::enable_if_t<has_to_string<T>::value, std::string> { return std::to_string(t); } template<typename T> auto stringify(T t) -> std::enable_if_t<!has_to_string<T>::value, std::string> { return static_cast<ostringstream&>(ostringstream() << t).str(); }
以上がstd::to_string の可用性に基づいて実装を選択するテンプレート関数を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。