2017-06-28 61 views
3

everyone。 我正在調試模板類嚴重類型不匹配的問題。我想知道編譯期間的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++書中挑選出來的一個巧妙的技巧。對於目前爲止我所遇到的大多數主流編譯器來說,它似乎都能很好地工作。

如果你想在運行

#include <iostream> 
#include <typeinfo> 

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

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

注意要獲得類型信息,不要通過typeid太舒服RTTI(運行時類型信息),C++還提供了幾種編譯時間型內省實用程序http://en.cppreference.com/w/cpp/header/type_traits

+0

非常感謝。這正是我需要的! – CatDog

+0

@CatDog如果答案是好的,那麼你應該把它標記爲接受!你會得到少量的代表回報,以及:) – 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