作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试做一些部分特化的事情。我有一个 tuple
,我想从某个元素索引迭代到第一个元组索引,从 tuple
中的每个类型累积一个值。这似乎是使用递归模板实例化的简单问题。
问题是,我似乎无法让递归工作。为了停止递归,我需要在元组索引 0 处对模板函数进行部分特化。这看起来很简单,但它不起作用。
注意:我已经从示例中删除了实际的 tuple
内容,因为它无关紧要;是模板特化不起作用。
template<int Index, typename Tpl>
size_t CalcInterleaveByteOffset(const Tpl &t)
{
size_t prevOffset = CalcInterleaveByteOffset<Index - 1>(t);
return prevOffset + sizeof(Tpl);
}
template<typename Tpl>
size_t CalcInterleaveByteOffset<0, Tpl>(const Tpl &t)
{
return 0;
}
GCC simply says that this kind of specialization is not allowed.真的吗?有没有其他方法可以处理这种事情?
最佳答案
一般来说,函数不允许任何形式的部分模板特化。但是,它允许用于类(class)。所以解决方案只是将你的函数移动到模板化持有者类的静态成员中。
如果您需要推断模板参数,则可以创建一个调用模板类的包装函数。
结果是这样的:
template<int Index, typename Tpl>
class CalcInterleaveByteOffsetImpl
{
static size_t CalcInterleaveByteOffset(const Tpl &t)
{
// This is OK it calls the wrapper function
// You could also do
// size_t prevOffset = CalcInterleaveByteOffsetImpl<Index - 1, Tpl>::CalcInterleaveByteOffset(t);
size_t prevOffset = ::CalcInterleaveByteOffset<Index - 1>(t);
return prevOffset + sizeof(Tpl);
}
};
template<typename Tpl>
class CalcInterleaveByteOffsetImpl<0, Tpl>
{
static size_t CalcInterleaveByteOffset(const Tpl &t)
{
return 0;
}
};
template<int Index, typename Tpl>
size_t CalcInterleaveByteOffset(const Tpl &t)
{
return CalcInterlaveByteOffsetImpl<Index,Tpl>::CalcInterleaveByteOffset(t);
}
关于c++ - 具有整数参数的模板的部分特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12683165/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!