2016-01-20 50 views
-2

在GCC,我可以使用下面的代碼在C++中ARG類型:如何確定

#define is_t(smth, type) ({int is_t_result; if (__builtin_types_compatible_p(__typeof__(smth), type)) {is_t_result = 1;}; is_t_result;}) 

但是當我在googletest運行它(C++),它提升

error: expected primary-expression before ‘__typeof__’ 

是有替代品在cpp中實現is_t

回答

1

這是一個非常複雜的問題,因爲有很多不同的方法來「檢測類型」,具體取決於你要完成的是什麼。基本上有兩種不同類型的「類型檢查」:編譯時和運行時。就編譯時檢查而言,在C++模板中使用「duck-typing」是非常普遍的(如果滿足隱式需求,它就可以工作)。然而,在某些情況下,這是不夠的,並且<type_traits>static_assert提供了更明確地強制執行要求的方式,而decltype允許引用表達式將返回的類型。運行時的類型轉換在C++中較少見(通常通過「動態調度」,也就是虛擬函數來完成)。但是,就顯式檢查對象的運行時類型而言,存在dynamic_cast<T>機制。

長篇短小,儘管如此,您的is_t()宏可能最好被內置的C++類型檢測機制所取代。如果您使用的是早期版本的C++,則Boost提供了廣泛兼容的等價物,它可以在許多C++編譯器以及C++ 98和C++ 11中使用。這樣做會使得它變得更加清晰。 (例如它是否被聲明爲該類型,它是否具有該運行時類型,是否聲明爲可分配給其他類型的類型)。

+0

我只想確定c類型(int,float double,char *)並讓googletest傳遞,有沒有簡單的方法?我不寫C++,只是用googletest – ichvenkait

+0

我不確定你的意思是說你「不寫C++,只是用Google測試」...... Google測試是一個C++的單元測試框架......我不知道不理解如何在不理解正在測試的代碼的情況下編寫測試。你最好的辦法是將「is_t(Type,x)」定義爲「typeid(T)== typeid(x)」,但是這種類型做了精確的比較......它沒有考慮多態關係。這就是爲什麼這樣的宏很混亂。 –