我試圖實現C++14別名模板make_integer_sequence
,這簡化了創建類模板integer_sequence
。執行C++ 14 make_integer_sequence
template< class T, T... I> struct integer_sequence
{
typedef T value_type;
static constexpr size_t size() noexcept { return sizeof...(I) ; }
};
template< class T, T N>
using make_integer_sequence = integer_sequence< T, 0,1,2, ... ,N-1 >; // only for illustration.
要實現make_integer_sequence
我們需要一個幫手結構make_helper
。
template< class T , class N >
using make_integer_sequence = typename make_helper<T,N>::type;
實現make_helper
不是太困難。與RAM 8GBs
int main()
{
#define GEN(z,n,temp) \
typedef make_integer_sequence< int, n > BOOST_PP_CAT(int_seq,n) ;
BOOST_PP_REPEAT(256, GEN, ~);
}
我用GCC 4.8.0編譯的程序,四核i5系統上:
template< class T, T N, T... I >
struct make_helper
{
typedef typename mpl::if_< T(0) == N,
mpl::identity< integer_sequence<T,I...> >,
make_helper< T, N-1, N-1,I...>
>::type;
};
爲了測試make_integer_sequence
我做了這個主要功能。 成功編譯花費了4秒鐘。
但是,當我改變了GEN宏:
int main() {
#define GEN(z,n,temp) \
typedef make_integer_sequence< int, n * 4 > BOOST_PP_CAT(int_seq, n) ;
BOOST_PP_REPEAT(256, GEN, ~);
}
編譯不成功,輸出的錯誤消息:
virtual memory exhausted.
有人能解釋這個錯誤,是什麼原因造成的呢?
編輯:
我簡化了測試:
int main()
{
typedef make_integer_sequence< int, 4096 > int_seq4096;
}
我然後成功地與GCC 4.8.0 -ftemplate深入= 65536編譯。
不過本次測試:
int main()
{
typedef make_integer_sequence< int, 16384 > int_seq16384;
}
沒有與GCC 4.8.0 -ftemplate深度= 65536編譯,並導致錯誤:
virtual memory exhausted.
所以,我的問題是,我如何減少模板深度實例化?
Regards, Khurshid。
在由STLavavej談話,我想我聽說微軟編譯器有一個鉤來產生'make_integer_sequence'自動在O(基本?)( 1)。具有諷刺意味的是,對於編譯器自己生成的東西來說,實現這一點非常有效。 – alfC