ホームページ > バックエンド開発 > C++ > C で関数の可用性の型特性を定義するにはどうすればよいですか?

C で関数の可用性の型特性を定義するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-09 10:48:02
オリジナル
792 人が閲覧しました

How to Define a Type Trait for Function Availability in C  ?

メタプログラミング: 別個の関数定義としての 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&amp;>(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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート