3 回答

TA貢獻(xiàn)1796條經(jīng)驗 獲得超4個贊
您可以獲得的最接近的是使用C ++ 0x功能從可變參數(shù)模板參數(shù)列表初始化模板的本地或成員數(shù)組。
這當(dāng)然受到最大模板實(shí)例化深度的限制,并且必須測量實(shí)際上在您的情況下顯著差異。
例:
template<unsigned... args> struct ArrayHolder {
static const unsigned data[sizeof...(args)];
};
template<unsigned... args>
const unsigned ArrayHolder<args...>::data[sizeof...(args)] = { args... };
template<size_t N, template<size_t> class F, unsigned... args>
struct generate_array_impl {
typedef typename generate_array_impl<N-1, F, F<N>::value, args...>::result result;
};
template<template<size_t> class F, unsigned... args>
struct generate_array_impl<0, F, args...> {
typedef ArrayHolder<F<0>::value, args...> result;
};
template<size_t N, template<size_t> class F>
struct generate_array {
typedef typename generate_array_impl<N-1, F>::result result;
};
適用于您的1..5情況:
template<size_t index> struct MetaFunc {
enum { value = index + 1 };
};
void test() {
const size_t count = 5;
typedef generate_array<count, MetaFunc>::result A;
for (size_t i=0; i<count; ++i)
std::cout << A::data[i] << "\n";
}

TA貢獻(xiàn)1818條經(jīng)驗 獲得超8個贊
那么你的要求是如此模糊,很難對它們采取任何行動......主要問題當(dāng)然是:這些價值來自哪里?
無論如何,C ++中的構(gòu)建可以被認(rèn)為是4個步驟:
預(yù)構(gòu)建步驟:從其他格式生成頭/源的腳本
預(yù)處理
模板實(shí)例化
編譯正確
如果您希望排除腳本生成,那么您將有兩種選擇:預(yù)處理和元模板編程。
我不知道元模板編程在這里可以做到這一點(diǎn),因為據(jù)我所知,在編譯時不可能連接兩個數(shù)組。因此,我們留下了當(dāng)時的救星:預(yù)處理程序編程
我建議使用一個完整的庫來幫助我們:Boost.Preprocessor。
特別感興趣的是:
BOOST_PP_FOR
BOOST_PP_REPEAT
現(xiàn)在,只要我們知道從哪里挑選價值,我們就可以給出更有意義的例子。

TA貢獻(xiàn)1802條經(jīng)驗 獲得超4個贊
如何使用模板構(gòu)建嵌套結(jié)構(gòu),并將其轉(zhuǎn)換為正確類型的數(shù)組。下面的例子適用于我,但我有一種感覺,我要么正在踩踏,要么走得非常接近未定義的行為。
#include <iostream>
template<int N>
struct NestedStruct
{
NestedStruct<N-1> contained;
int i;
NestedStruct<N>() : i(N) {}
};
template<>
struct NestedStruct<0>
{
int i;
NestedStruct<0>() : i(0) {}
};
int main()
{
NestedStruct<10> f;
int *array = reinterpret_cast<int*>(&f);
for(unsigned int i=0;i<10;++i)
{
std::cout<<array[i]<<std::endl;
}
}
當(dāng)然你可能會爭辯說數(shù)組在編譯時沒有初始化(我認(rèn)為這是不可能的)但是進(jìn)入數(shù)組的值是在編譯時計算的,你可以像普通數(shù)組那樣訪問它們。我認(rèn)為那是你能得到的盡可能接近的。
- 3 回答
- 0 關(guān)注
- 574 瀏覽
添加回答
舉報