在用C编译时的静态数组++ [英] Static arrays at compile time in C++

查看:115
本文介绍了在用C编译时的静态数组++的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在想,如果有可能做出如下<一个href=\"http://stackoverflow.com/questions/2978259/programmatically-create-static-arrays-at-compile-time-in-c/2981617#2981617\">answer更通用的,在这个意义上,所述阵列的类型来代替模板只是无符号的

我已经封闭了整个事情的一个结构,像这样:

 模板&LT; typename的数组类型&GT;
结构数组
{
模板&LT;数组类型参数... args&GT;结构ArrayHolder {
    静态常量数组类型的数据[...的sizeof(参数)];
};模板&LT;数组类型参数... args&GT;
常量数组类型ArrayHolder&LT; ARGS ...&GT; ::数据[...的sizeof(参数)] = {ARGS ...};模板&LT;为size_t N,模板&LT;为size_t&GT; F级,数组类型参数... args&GT;
结构generate_array_impl {
    的typedef typename的generate_array_impl&LT; N-1,F,F&LT; N&GT; ::值,ARGS ...&GT; ::结果的结果;
};模板&LT;模板&LT;为size_t&GT; F级,数组类型参数... args&GT;
结构generate_array_impl℃下,F ARGS ...&GT; {
    typedef的ArrayHolder&LT; F&℃的GT; ::值,ARGS ...&GT;结果;
};模板&LT;为size_t N,模板&LT;为size_t&GT;类F&GT;
结构generate_array {
    的typedef typename的generate_array_impl&LT; N-1,F&GT; ::结果的结果;
};
};

但我得到以下错误:

  C ++  -  4.6 -std =的C ++ 0x -o测试TEST.CPP
TEST.CPP:49:17:错误:专业会员的阵列&LT;&数组类型GT; :: ArrayHolder&LT;&ARGS GT; ::数据'需要'模板和LT;&GT;'语法


解决方案

它帮助,如果您缩进结构。问题是,你所定义的数组结构中的数据静态成员变量。但是,应该在命名空间范围:

 模板&LT; typename的数组类型&GT;
结构数组
{
    模板&LT;数组类型参数... args&GT;结构ArrayHolder {
        静态常量数组类型的数据[...的sizeof(参数)];
    };    模板&LT;为size_t N,模板&LT;为size_t&GT; F级,数组类型参数... args&GT;
        结构generate_array_impl {
            的typedef typename的generate_array_impl&LT; N-1,F,F&LT; N&GT; ::值,ARGS ...&GT; ::结果的结果;
        };    模板&LT;模板&LT;为size_t&GT; F级,数组类型参数... args&GT;
        结构generate_array_impl℃下,F ARGS ...&GT; {
            typedef的ArrayHolder&LT; F&℃的GT; ::值,ARGS ...&GT;结果;
        };    模板&LT;为size_t N,模板&LT;为size_t&GT;类F&GT;
        结构generate_array {
            的typedef typename的generate_array_impl&LT; N-1,F&GT; ::结果的结果;
        };
};模板&LT; typename的数组类型&GT;模板&LT;数组类型参数... args&GT;
        常量数组类型数组&LT;&数组类型GT; :: ArrayHolder&LT; ARGS ...&GT; ::数据[...的sizeof(参数)] = {ARGS ...};

I was wondering if its possible to make the following answer more generic, in the sense that the type of the array be templated instead of just unsigned:

I've enclosed the whole thing in a struct like so:

template<typename ArrayType>
struct Array
{
template<ArrayType... args> struct ArrayHolder {
    static const ArrayType data[sizeof...(args)];
};

template<ArrayType... args> 
const ArrayType ArrayHolder<args...>::data[sizeof...(args)] = { args... };

template<size_t N, template<size_t> class F, ArrayType... 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, ArrayType... 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;
};
};

but I get the following errors:

c++-4.6 -std=c++0x -o test test.cpp
test.cpp:49:17: error: specializing member ‘Array<ArrayType>::ArrayHolder<args>::data’ requires ‘template<>’ syntax

解决方案

It helps if you indent the struct. The problem is that you are defining the data static member variable inside the Array struct. But it should be at namespace scope:

template<typename ArrayType>
struct Array
{
    template<ArrayType... args> struct ArrayHolder {
        static const ArrayType data[sizeof...(args)];
    };

    template<size_t N, template<size_t> class F, ArrayType... 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, ArrayType... 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;
        };
};

template<typename ArrayType> template<ArrayType... args> 
        const ArrayType Array<ArrayType>::ArrayHolder<args...>::data[sizeof...(args)] = { args... };

这篇关于在用C编译时的静态数组++的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆