everyone。 我正在調試模板類嚴重類型不匹配的問題。我想知道編譯期間的C++類型信息,所以我寫這個:如何在編譯期間輸出C++類型信息
#pragma message typeinfo(var)
它只是不工作。
所以我在這裏尋求一些幫助。我不確定這是否可能。但我認爲編譯期間編譯器必須知道類型信息。
everyone。 我正在調試模板類嚴重類型不匹配的問題。我想知道編譯期間的C++類型信息,所以我寫這個:如何在編譯期間輸出C++類型信息
#pragma message typeinfo(var)
它只是不工作。
所以我在這裏尋求一些幫助。我不確定這是否可能。但我認爲編譯期間編譯器必須知道類型信息。
預編譯器在編譯時不會幫你很多。它的工作是預處理,這是在編譯之前發生的。
如果這個想法是輸出類型的信息編譯時請嘗試以下
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。
我使用的打印機輔助函數類型,它只是基於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。也許這將有助於解決奇怪的模板問題。
偉大的解決方案。但是,我正在尋找一種編譯時解決方案來打印類型信息,因爲編譯器在運行該程序之前顯示一些類型錯誤。 – CatDog
非常感謝。這正是我需要的! – CatDog
@CatDog如果答案是好的,那麼你應該把它標記爲接受!你會得到少量的代表回報,以及:) – Curious