2016-02-19 70 views
3

這裏是我想要做的是否可以在模板類之外獲取指定的模板類型?

template <typename T> 
class myClass {}; 

auto p = new myClass<int32_t>; 
int TSizeOfP = sizeof(??); 

簡化版本,所以我想這是我設置爲從對象的指針int32_t外MyClass的第t。我想知道我把它設置爲什麼,所以我可以做= sizeof(int32_t),但我希望能夠聲明一次類型,而不必遍歷所有我寫sizeof(int32_t)的地方,如果我決定改變類型。

我也可以做一些像#define pType int32_t或使用語句或其他任何東西,但如果有辦法做到這一點沒有多餘的線,我想聽聽它。

回答

3

如何使尺碼成爲會員?

template <typename T> 
class myClass 
{ 
    typedef T type; 
    static constexpr std::size_t TypeSize = sizeof(T); 
}; 

//... 

std::size_t TSizeofP = p->TypeSize; 
5

你可以寫一個具有部分特化的模板類和一個輔助函數來完成它。

template <typename T> 
struct template_parameter_type { 
}; 
template <typename T, template <typename> class C> 
struct template_parameter_type<C<T>> { 
    typedef T type; 
}; 
template <typename T> 
auto get_size(T*) { 
    return sizeof(typename template_parameter_type<T>::type); 
} 

然後

auto p = new myClass<int32_t>; 
int TSizeOfP = get_size(p); 

LIVE

+1

這很聰明。解決問題的非侵入性方式。 –

+1

您可以通過在'template_parameter_type'專業化中添加'static constexpr auto size = sizeof(T);'來擺脫最終的模板函數,將其變爲一個元函數。 –

3

試試這個:

#include <iostream> 
using namespace std; 

template <template<typename> class TT, typename T> 
int typesizeof(TT<T>*& o) { 
    return sizeof(T); 
} 

template <typename T> 
class myClass {}; 

int main() { 


    auto p = new myClass<int32_t>; 
    cout << typesizeof(p); 
    return 0; 
} 

小更緊湊的嵌套結構。

相關問題