C++ 有效地获取某个索引的参数包大小
我希望能够确定从0到给定索引的参数包子集中的字节数 现在我正在使用一种非constexpr的方法来做这件事。下面是我的代码: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...
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;};
。