Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从模板结构创建二维数组_C++_Templates_Template Specialization - Fatal编程技术网

C++ 如何从模板结构创建二维数组

C++ 如何从模板结构创建二维数组,c++,templates,template-specialization,C++,Templates,Template Specialization,我已经就下面的代码问了几个问题,并且得到了很多帮助。。。我相当新的C++,只是玩这个代码,我在这里找到。我想创建一个2d数组,然后用它调用一个包含2个模板参数的模板函数。。代码和问题/评论如下。我现在宁愿把它作为一个纯数组(而不是std::array)来使用,这样我就可以理解发生了什么 class Test { public: template<int N> bool foo(double x, double y) { assert(false); } te

我已经就下面的代码问了几个问题,并且得到了很多帮助。。。我相当新的C++,只是玩这个代码,我在这里找到。我想创建一个2d数组,然后用它调用一个包含2个模板参数的模板函数。。代码和问题/评论如下。我现在宁愿把它作为一个纯数组(而不是std::array)来使用,这样我就可以理解发生了什么

class Test
{
public:
    template<int N>
    bool foo(double x, double y) { assert(false); }

    template<bool B, int N>
    double foo2(double x, double y) { assert(false); }

    template<int N, int... Ns>
    struct fn_table : fn_table < N - 1, N - 1, Ns... > {};

    template<int... Ns>
    struct fn_table < 0, Ns... >
    {
        //this expands to foo<0>,foo<1>...foo<Ns>,correct?
        static constexpr bool(*fns[])(double, double) = {foo<Ns>...};

        //how to make this part work for 2d array to include bool from foo2?
            //  Compiler gives: "parameter packs not expanded with ..."
        static constexpr bool(*fns2[][Ns])(double, double) = {foo2<Ns, Ns>...}; 
            //instead of [][Ns] and <Ns,Ns> can we explicity only create 2 rows for bool?
    };
};

template<> bool Test::foo<5>(double x, double) { return false; }

//will below work? will false be converted to match 0 from call in main?
template<> double Test::foo2<false, 1>(double x, double y) { return x; }

template<int... Ns>
constexpr bool(*Test::fn_table<0, Ns...>::fns[sizeof...(Ns)])(double, double);

//how to define for 2d fns2?
template<int... Ns>
constexpr bool(*Test::fn_table<0, Ns...>::fns2[][sizeof...(Ns)])(double, double);

int main(int argc, char* argv[])
{
    int val = atoi(argv[0]);
    int val2 = atoi(argv[1]);
    Test::fn_table<5> table;
    bool b = table::fns[val];
    double d = table::fns2[0, val];
    double d = table::fns2[false, val];//does false convert to 0? 
    return 0;
}
类测试
{
公众:
模板
boolfoo(双x,双y){assert(false);}
模板
双foo2(双x,双y){assert(false);}
模板
结构fn_表:fn_表{};
模板
结构fn_表<0,Ns…>
{
//这扩展到foo,foo…foo,对吗?
静态constexpr bool(*fns[])(double,double)={foo…};
//如何使该部分在2d数组中工作,以包括来自foo2的bool?
//编译器给出:“参数包未扩展为…”
静态constexpr bool(*fns2[][Ns])(双精度,双精度)={foo2…};
//而不是[][Ns],我们可以明确地只为bool创建2行吗?
};
};
模板bool Test::foo(双x,双){return false;}
//下面有用吗?false是否会从main中的调用转换为匹配0?
模板双重测试::foo2(双x,双y){return x;}
模板
constexpr bool(*测试::fn_表::fns[sizeof…(Ns)])(双精度,双精度);
//如何定义二维fns2?
模板
constexpr bool(*测试::fn_表::fns2[][sizeof…(Ns)])(双精度,双精度);
int main(int argc,char*argv[])
{
int val=atoi(argv[0]);
int val2=atoi(argv[1]);
测试:fn_表;
bool b=表::fns[val];
双d=表::fns2[0,val];
double d=table::fns2[false,val];//false是否转换为0?
返回0;
}

这可能会让你更接近:

template<int... Ns>
struct fn_table < 0, Ns... >
{
    static constexpr double(*fns2[2][sizeof...(Ns)])(double, double) =
    { { &foo2<false, Ns>... }, { &foo2<true, Ns>... } }; 
模板
结构fn_表<0,Ns…>
{
静态constexpr双精度(*fns2[2][sizeof…(Ns)])(双精度,双精度)=
{{&foo2…},{&foo2…};
}


该程序还有许多其他问题,不过…

这可能会让您更接近:

template<int... Ns>
struct fn_table < 0, Ns... >
{
    static constexpr double(*fns2[2][sizeof...(Ns)])(double, double) =
    { { &foo2<false, Ns>... }, { &foo2<true, Ns>... } }; 
模板
结构fn_表<0,Ns…>
{
静态constexpr双精度(*fns2[2][sizeof…(Ns)])(双精度,双精度)=
{{&foo2…},{&foo2…};
}


这个程序还有很多其他问题,不过…

啊,我明白了。这是有道理的。。还有哪些其他问题?在编译方面,如果删除引用fns2的语句,它将进行编译。看起来这会起作用。。我想知道bool/int转换是否有效。啊,我明白了。这是有道理的。。还有哪些其他问题?在编译方面,如果删除引用fns2的语句,它将进行编译。看起来这会起作用。。我想知道bool/int转换是否有效。