2017-06-28 27 views
3

皆さん。 テンプレートの多いクラスの型の不一致の問題をデバッグしています。コンパイル時にC++の情報を知りたいので、次のように書いています。コンパイル時にC++型情報を出力する方法

#pragma message typeinfo(var) 

ちょうどうまくいきません。

ここで私はいくつかの助けを求めています。それが可能かどうかはわかりません。しかし、コンパイラは、コンパイル時に型情報を知っていなければならないと思います。

答えて

6

プリプロセッサは、コンパイル時にあまり役に立ちません。ジョブは前処理です。これはコンパイル時に発生します。

アイデアは、次の

template <typename...> struct WhichType; 
class Something {}; 

int main() { 
    WhichType<Something>{}; 
} 

Live example hereを試行しコンパイル時で出力タイプ情報にある場合。これをコンパイルすると、WhichTypeをインスタンス化しようとするときに、テンプレート内にあるもののタイプを示すエラーが発生するはずです。これはScott MeyersのEssential Modern C++の本から拾った素敵なトリックでした。これまで私が遭遇したほとんどの主流コンパイラでは完全に動作するようです。あなたはtypeid経由RTTI(実行時型情報)と、あまりにも快適な取得しないでくださいランタイム

#include <iostream> 
#include <typeinfo> 

using std::cout; 
using std::endl; 

int main() { 
    auto integer = int{}; 
    cout << typeid(integer).name() << endl; 
} 

で型情報を取得したい場合は

は、C++は、いくつかのコンパイルを提供しています時間型イントロスペクションユーティリティhttp://en.cppreference.com/w/cpp/header/type_traits

+0

ありがとうございます。それはまさに私が必要なものです! – CatDog

+0

@CatDog答えがOKだったら、それを受け入れてください!あなたも同様にリターンの少量を得るでしょう:) – Curious

1

gccの定義済みマクロ__PRETTY_FUNCTION__に基づいたプリンタヘルパー機能を使用します。あなたがテンプレートをどのタイプに展開するかを知る必要がある時から、永遠に食べるテンプレート関数を書くだけです。私にとっては、SFINAEの問題などの場合にこのような関数を使用することは非常に役に立ちました。

template <typename ... T> 
void TemplatePrint(T ... args) 
{ 
    std::cout << __PRETTY_FUNCTION__ << std::endl; 
} 

int main() 
{ 
    auto any = std::tuple_cat(std::tuple<int, double>{}, std::tuple<std::string>{}); 
    TemplatePrint(any); 
} 

あなたは、特定のコンパイラにあなたの質問にタグを付けていなかったので、あなたは多分、他のコンパイラの同等物を検索する必要があります。

何年か前のC++での話は、約 https://baptiste-wicht.com/posts/2016/02/use-templight-and-templar-to-debug-cpp-templates.htmlです。たぶんこれは、奇妙なテンプレートの問題を解決するのに役立ちます。

+0

素晴らしい解決策。しかし、コンパイラはプログラムを実行する前に型エラーを表示するので、タイプ情報を出力するコンパイル時の解決策を探しています。 – CatDog

関連する問題