メタプログラミング: 別個の関数定義としての C 関数定義の失敗
C では、型の特性に基づいてメタ関数を定義できます。たとえば、値の型が算術型かどうかに基づいて値を文字列に変換するテンプレートを定義できます。
template<typename T> enable_if_t<is_arithmetic<T>::value, string> stringify(T t){ return to_string(t); } template<typename T> enable_if_t<!is_arithmetic<T>::value, string> stringify(T t){ return static_cast<ostringstream&>(ostringstream() << t).str(); }
ただし、このアプローチは型の is_arithmetic プロパティに依存します。より望ましいアプローチは、その型の std::to_string 関数の可用性に基づくものです。ただし、次の要件を型特性として表現するのは困難です:
「型に std::to_string が定義されている場合は、それを使用します。」
std の基準を宣言することは可能です。 ::to_string の可用性:
template<typename T> decltype(to_string(T{})) stringify(T t){ return to_string(t); }
しかし、その逆を構築する方法は不明です
Walter Brown の void_t 型特性を使用すると、目的の型特性を簡単に定義できます。
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 { };
この特性は、指定された型に対して std::to_string 関数が定義されているかどうかを評価します。機能の可用性に基づいて、より柔軟なテンプレートの選択が可能になります。
以上がC で関数の可用性の型特性を定義するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。