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_C++11_Template Meta Programming - Fatal编程技术网

C++ 有效地获取某个索引的参数包大小

C++ 有效地获取某个索引的参数包大小,c++,templates,c++11,template-meta-programming,C++,Templates,C++11,Template Meta Programming,我希望能够确定从0到给定索引的参数包子集中的字节数 现在我正在使用一种非constexpr的方法来做这件事。下面是我的代码: template <size_t index, typename... args> struct pack_size_index; template <size_t index, typename type_t, typename... args> struct pack_size_index <index, type_t, args...

我希望能够确定从0到给定索引的参数包子集中的字节数

现在我正在使用一种非constexpr的方法来做这件事。下面是我的代码:

template <size_t index, typename... args> struct pack_size_index;

template <size_t index, typename type_t, typename... args>
struct pack_size_index <index, type_t, args...> {
    static const size_t index_v = index;

    static const size_t value(void) {
        if (index_v > 0) {
            return sizeof(type_t) + pack_size_index<index - 1, args...>::value();
        }

        return 0;
    }
};

template <size_t index> struct pack_size_index <index> {
    static const size_t index_v = index;

    static const size_t value(void) { return 0; }
};
模板结构包大小索引;
模板
结构包大小索引{
静态常数大小指数=指数;
静态常量大小\u t值(无效){
如果(索引>0){
返回sizeof(type_t)+pack_size_index::value();
}
返回0;
}
};
模板结构包大小索引{
静态常数大小指数=指数;
静态常量大小\u t值(void){返回0;}
};
用法:

//output: 5  (equal to 1 + 4)
std::cout << pack_size_index<2, bool, float, int, double>::value() << std::endl;

//output: 20 (equal to 8 + 8 + 4)
std::cout << pack_size_index<3, double, double, float, int>::value() << std::endl;
//输出:5(等于1+4)
std::无法解决,我认为:

template <size_t index, typename... args> struct pack_size_index;

template <size_t index, typename type_t, typename... args>
struct pack_size_index <index, type_t, args...> {
    static const size_t value = (index > 0)?
        (sizeof(type_t) + pack_size_index<index - 1, args...>::value):0;
};

template <size_t index> struct pack_size_index <index> {
    static const size_t value = 0;
};
模板结构包大小索引;
模板
结构包大小索引{
静态常量大小\u t值=(索引>0)?
(sizeof(type_t)+pack_size_index::value):0;
};
模板结构包大小索引{
静态常量大小\u t值=0;
};

看起来你很接近于拥有一个编译时模板解决方案,至于可执行文件大小的增加,可变模板可以做到这一点,但不可避免的是,不管是谁发布了答案并删除了它,都会把它放回原处,因为它是正确的,哈哈。答案不是在编译时运行的,这不是你想要的吗?我只是修改了它,删除了index_v,用index替换它,index是一个常量表达式。编译的大小仍然是一样的,如果这意味着什么的话。我删除了我的答案,这整件事最终变成了一个误会,我累了。希望我给了你一些帮助看起来不错,你可以通过使用变量大小来摆脱大小索引。。。操作人员也可以通过确保它永远不会到达itAh来摆脱第二个专门化,大小索引在那里,因为它在索引之后停止计算字节大小,但我可以摆脱这个专门化。实际上它不允许我摆脱它:/I将发布一些东西给我一分钟,它是:
template struct pack\u size\u index{static const size\u t value=0;};