依赖的非类型模板参数和可变参数模板

2024-03-06

我正在尝试扩展提供的可能性std::integer_sequence http://en.cppreference.com/w/cpp/utility/integer_sequence一个名为的新类integer_range(显然,这在两个边界之间创建了一个整数序列)。我的实施是基于我的回答这个问题 https://codereview.stackexchange.com/q/45549/15094我试图适应std::integer_sequence:

namespace details
{
    template<typename Int, Int C, Int P, Int... N>
    struct increasing_integer_range:
        increasing_integer_range<Int, C-1, P+1, N..., P>
    {};

    template<typename Int, Int C, Int P, Int... N>
    struct decreasing_integer_range:
        decreasing_integer_range<Int, C+1, P-1, N..., P>
    {};

    template<typename Int, Int P, Int... N>
    struct increasing_integer_range<Int, 0, P, N...>:
        std::integer_sequence<Int, N...>
    {};

    template<typename Int, Int P, Int... N>
    struct decreasing_integer_range<Int, 0, P, N...>:
        std::integer_sequence<Int, N...>
    {};
}

template<typename Int, Int S, Int E,  bool Increasing=(S<E)>
struct integer_range;

template<typename Int, Int S, Int E>
struct integer_range<Int, S, E, true>:
    details::increasing_integer_range<Int, std::integral_constant<Int, E-S>, S>
{};

template<typename Int, Int S, Int E>
struct integer_range<Int, S, E, false>:
    details::decreasing_integer_range<Int, std::integral_constant<Int, E-S>, S>
{};

template<std::size_t S, std::size_t E>
using index_range = integer_range<std::size_t, S, E>;

我认为这个改变是微不足道的(添加一个typename模板参数),但这实际上在特化中引入了依赖非类型参数的问题0。这是编译器错误:

error: type `Int` of template argument `0` depends on a template parameter

基本问题已经有 https://stackoverflow.com/q/22486386/1364752一些解决方案。但是,由于我使用可变参数模板,因此修复变得更加困难:这个答案 https://stackoverflow.com/a/22487113/1364752无法工作,因为我不允许在可变参数模板之后有默认模板参数。因此,我尝试实施中提到的修复接受的答案 https://stackoverflow.com/a/22486607/1364752但正如评论中提到的,我的编译器(g++ 4.8.1)似乎无法消除歧义,并认为以下两个专业化都是同样专业化的:

  • struct increasing_integer_range<Int, std::integral_constant<Int, C>, P, N...>: /* */
  • struct increasing_integer_range<Int, std::integral_constant<Int, 0>, P, N...>: /* */

还有其他方法可以解决这个问题吗?我没主意了。


我会简单地减少你的integer_range单个非递归调用std::integer_sequence:

namespace details
{
    template<typename Int, typename, Int S>
    struct increasing_integer_range;

    template<typename Int, Int... N, Int S>
    struct increasing_integer_range<Int, std::integer_sequence<Int, N...>, S>
        : std::integer_sequence<Int, N+S...>
    {};

    template<typename Int, typename, Int S>
    struct decreasing_integer_range;

    template<typename Int, Int... N, Int S>
    struct decreasing_integer_range<Int, std::integer_sequence<Int, N...>, S>
        : std::integer_sequence<Int, S-N...>
    {};
}

template<typename Int, Int S, Int E,  bool Increasing=(S<E)>
struct integer_range;

template<typename Int, Int S, Int E>
struct integer_range<Int, S, E, true>:
    details::increasing_integer_range<Int, std::make_integer_sequence<Int, E-S>, S>
{};

template<typename Int, Int S, Int E>
struct integer_range<Int, S, E, false>:
    details::decreasing_integer_range<Int, std::make_integer_sequence<Int, S-E>, S>
{};

template<std::size_t S, std::size_t E>
using index_range = integer_range<std::size_t, S, E>;

我测试过:

template<std::size_t... N>
void dummy( const std::integer_sequence< std::size_t, N... >& );

int main()
{
    dummy( index_range< 2, 5 >() );
    dummy( index_range< 5, 2 >() );
}

得到预期的链接器错误:

main.cpp:(.text.startup+0xa): undefined reference to `void dummy<2ul, 3ul, 4ul>(detail::integer_sequence<unsigned long, 2ul, 3ul, 4ul> const&)'
main.cpp:(.text.startup+0x14): undefined reference to `void dummy<5ul, 4ul, 3ul>(detail::integer_sequence<unsigned long, 5ul, 4ul, 3ul> const&)'

实例 http://coliru.stacked-crooked.com/a/7cfe4c1931161d3d(通过自己的实现integer_sequence,跳过第一部分)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

依赖的非类型模板参数和可变参数模板 的相关文章

随机推荐

  • Postgres - 在所有数据库上运行相同的查询(相同的模式)

    希望这是一个非常简单的问题 我有一个简单的 SELECT 查询 内置了一些子查询 我有超过 40 个数据库 我需要对所有数据库 都具有相同的架构 运行此查询并将结果返回到一个大表中 我正在想象一个循环序列 就像javascript的i 0
  • python gui 事件乱序

    from Tkinter import from tkMessageBox import class Gui def init self root self container Frame root self container grid
  • 如何在 Chrome 扩展中使用内容脚本文件注入 CSS?

    我正在尝试从 JavaScript 注入 CSS 它作为内容脚本注入 content scripts matches http www google com js script js I found 类似的问题 https stackove
  • 禁用选项卡布局

    我正在使用设计库提供的新类 TabLayout 我希望在特定情况下我正在使用的标签不能再更改 我设法禁用其视图页面上的滑动 但我不知道如何通过单击选项卡来禁用页面更改 提前致谢 我遇到了同样的问题 我使用以下代码禁用选项卡上的触摸事件来解决
  • Android - 在 Eclipse 中创建新活动 [重复]

    这个问题在这里已经有答案了 简单的一个 我已经阅读了一些指南和教程 它们非常清楚如何开始一项活动 有目的 但是 如何在 Eclipse 中创建新活动 我可能可以手动完成此操作 但随后我必须修改R文件 自动生成 并添加新的 xml 布局 好的
  • pandas 有没有办法将 read_sql() 与 sql 语句一起使用,该语句需要多个变量?

    这是我的代码的一部分 我已经有一个包含值的数据库 并且需要根据该数据帧中的值创建一个新的数据帧 目前这些值只有 12 和 13 存储在header row ids多变的 当我运行脚本时 我收到以下错误消息 pandas io sql Dat
  • 当 Web API 中没有发布数据时,避免使用 null 模型

    这个问题与我想要实现的目标类似 当没有发布的属性与模型匹配时 避免在 ASP Net Web API 中使用 null 模型 https stackoverflow com questions 25160345 avoiding null
  • 每次击键都会调用 api

    我尝试创建这个反应网站 我可以在其中搜索一个地方 我遇到一个问题 因为每当我在搜索框中输入新字母时 就会调用 api 这会使网站非常慢 我不希望它每次击键时都调用 api 我认为这是因为第二个 useEffect 但如果我删除该 useEf
  • 如何更改 LaTeX 中的文档字体?

    如何将整个文档的字体更改为无衬线字体 或其他字体 感谢文森特答案中的链接 我找到了解决方案 renewcommand familydefault sfdefault 这会将默认字体系列更改为无衬线字体
  • 为什么invalidate()之后不调用onDraw?

    我在 stackoverflow 上找到了很多帖子 但仍然无法解决我的问题 这是我的代码片段 public class MyView extends RelativeLayout Button b1 Button b2 Context sC
  • 如何知道用户是否在 Telegram 中看到了我的机器人发送的消息?

    我正在开发一个 Telegram 机器人 我想知道与我的机器人开始私人聊天的用户是否已经看到机器人发送的特定消息 并想知道他什么时候看到的 可以这样做吗 非常感谢 目前这是不可能的
  • 找不到方法:Microsoft.AnalysisServices

    我已经使用 SSIS 包为数据仓库创建了 ETL 设置 一切都工作正常 直到最后一步 即 分析服务处理任务编辑器 每当我添加立方体并按 确定 时 我都会收到以下错误 找不到方法 Void Microsoft AnalysisServices
  • 如何删除 Xcode 9 中标记单词上插入的双引号

    Xcode 9 中的这个新功能seems没问题 但我无法习惯它 而且在大多数情况下 它要求我比旧的本机函数做更多的工作 如何防止 Xcode 引用标记的单词 而不是用单引号替换标记的单词 在这种情况下 当标记单词时Text并击中 我想要的结
  • AppDomain.UnhandledException 未捕获未处理的异常

    我们有一个 NET 3 5 程序集 dll 由 VB6 代理 exe 通过 COM 接口执行 VB6 代码确实调用 Ensure that no system dialog comes up when we GPF PreviousErro
  • JPA 和数据库中的列顺序

    我使用 Eclipselink 作为我的持久性提供程序 有什么方法可以指定列在数据库中出现的顺序吗 数据库中的列顺序与我的实体中的属性顺序不匹配 据我了解按字母顺序排列的休眠顺序列 但我找不到 Eclipselink 的任何规范 Eclip
  • 如何修改 Poly3DCollection 对象的 zdata?

    我当前正在修改 Line2D 对象的 xdata 和 ydata 属性 如下所示 plt setp ph xdata event xdata ydata event ydata thisline figure canvas draw 我想对
  • 何时在 Python 的 AST 中使用 ExtSlice 节点?

    绿树蛇 http greentreesnakes readthedocs org en latest index html gives 一个例子 http greentreesnakes readthedocs org en latest
  • OpenGL 和 WebGL 的 Alpha 渲染差异

    I m rendering the same scene using the same exact C code once to native OpenGL on windows and once using Emscripten to W
  • 用于 JSON 请求的 AlamoFire 异步完成处理程序

    使用 AlamoFire 框架后 我注意到completionHandler 在主线程上运行 我想知道下面的代码是否是在完成处理程序中创建核心数据导入任务的好习惯 Alamofire request GET http myWebSite e
  • 依赖的非类型模板参数和可变参数模板

    我正在尝试扩展提供的可能性std integer sequence http en cppreference com w cpp utility integer sequence一个名为的新类integer range 显然 这在两个边界之