ホームページ  >  記事  >  バックエンド開発  >  C テンプレートで型名を取得するには?

C テンプレートで型名を取得するには?

DDD
DDDオリジナル
2024-11-15 08:58:02558ブラウズ

How to Get Type Name in C   Templates?

C テンプレートでの型名の取得

C テンプレート プログラミングでは、変換後の型の名前を取得することが、エラー処理にとって重要な場合があります。 。データ ファイルを解析するテンプレート クラスを考えてみましょう。ほとんどの解析エラーはデータ ファイル エラーに起因します。ユーザーフレンドリーなエラー メッセージを提供するには、予期されるデータ型を特定することが不可欠です。

汎用の GetValue 関数は、セクションとキーの入力に基づいてデータ マップから値を取得します。期待された値を目的の型に変換できない場合は、例外がスローされます。ただし、エラー メッセージに含める予期される型名を決定するのは困難な場合があります。

コンパイル時ソリューション

型を使用すると、エレガントなコンパイル時ソリューションを実現できます。イントロスペクションと定義済みマクロ。関数テンプレート GetTypeName を定義するヘッダー ファイル (types.h) を作成します。

template<typename T> const wchar_t *GetTypeName();

#define DEFINE_TYPE_NAME(type, name) \
    template<>const wchar_t *GetTypeName<type>(){return name;}

.cpp ファイルの DEFINE_TYPE_NAME マクロを使用して、データ ファイルの解析プロセスで検出された型の型名を定義します。

DEFINE_TYPE_NAME(int, L"int")
DEFINE_TYPE_NAME(float, L"float")
DEFINE_TYPE_NAME(std::string, L"std::string")

GetValue 関数内で、以下を使用して型名を取得します。

const wchar_t *typeName = GetTypeName<T>();

このアプローチにより、未定義の型が見つかった場合にリンカー エラーが確実に作成され、必要な型定義の追加が求められます。 .

ランタイム型識別 (RTTI) を使用した代替ソリューション

ランタイム ソリューションは、RTTI を使用して取得できます。

std::type_info(T).name()

ただし、このソリューションは実行時のオーバーヘッドが発生するため、頻繁に呼び出される関数にとっては望ましくありません。

以上がC テンプレートで型名を取得するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。