3 回答
TA贡献1796条经验 获得超4个赞
您可以获得的最接近的是使用C ++ 0x功能从可变参数模板参数列表初始化模板的本地或成员数组。
这当然受到最大模板实例化深度的限制,并且必须测量实际上在您的情况下显着差异。
例:
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贡献1818条经验 获得超8个赞
那么你的要求是如此模糊,很难对它们采取任何行动......主要问题当然是:这些价值来自哪里?
无论如何,C ++中的构建可以被认为是4个步骤:
预构建步骤:从其他格式生成头/源的脚本
预处理
模板实例化
编译正确
如果您希望排除脚本生成,那么您将有两种选择:预处理和元模板编程。
我不知道元模板编程在这里可以做到这一点,因为据我所知,在编译时不可能连接两个数组。因此,我们留下了当时的救星:预处理程序编程
我建议使用一个完整的库来帮助我们:Boost.Preprocessor。
特别感兴趣的是:
BOOST_PP_FOR
BOOST_PP_REPEAT
现在,只要我们知道从哪里挑选价值,我们就可以给出更有意义的例子。
TA贡献1802条经验 获得超4个赞
如何使用模板构建嵌套结构,并将其转换为正确类型的数组。下面的例子适用于我,但我有一种感觉,我要么正在踩踏,要么走得非常接近未定义的行为。
#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;
}
}
当然你可能会争辩说数组在编译时没有初始化(我认为这是不可能的)但是进入数组的值是在编译时计算的,你可以像普通数组那样访问它们。我认为那是你能得到的尽可能接近的。
- 3 回答
- 0 关注
- 548 浏览
添加回答
举报