使用 SFINAE 检测某物是否在(增强)范围内

2024-03-07

对于日志记录代码,我想检测模板函数的给定参数是否可以使用以下工具进行迭代升压范围 http://www.boost.org/libs/range/doc/html/index.html或不。显然,无论是否,我都需要实例化不同的代码,所以我需要 SFINAE,可能(好吧,当然)与 boost::enable_if 结合使用。我试过检测是否begin and end自由函数的定义如下:

namespace is_range_impl {
    template <typename T> T &make();
    struct any { template <class T> any(T const&); };
    struct not_range {};
    not_range begin(const any &);
    not_range end(const any &);
    struct no_type { char x[8]; };
    typedef char yes_type;
    template <typename T> yes_type check(const T &t);
    no_type check(const not_range &t);
    using boost::begin;
    using boost::end;
    template <typename T> struct is_range_impl {
        enum e {
            value = (sizeof(check(begin(make<T>()))) == sizeof(yes_type) &&
                     sizeof(check(end(make<T>()))) == sizeof(yes_type)),
        };
    };
}

template <typename T>
struct is_range : public is_range_impl::is_range_impl<T> {};

template <typename T>
typename boost::disable_if<is_range<T> >::type repr(std::ostream &s, const T &v)
{ ... }

template <typename T>
typename boost::enable_if<is_range<T> >::type repr(std::ostream &s, const T &v)
{ ... }

但不要默默地失败boost::begin and boost::end没有明确定义,它会严重失败并出现错误

'type' : is not a member of 'boost::mpl::eval_if_c<C,F1,F2>'
    [C=false, F1=boost::range_const_iterator<void *>, F2=boost::range_mutable_iterator<void *>]

在下面的代码中boost/range/iterator.hpp:63:

typedef BOOST_RANGE_DEDUCED_TYPENAME
        mpl::eval_if_c< is_const<C>::value,
                        range_const_iterator< typename remove_const<C>::type >,
                        range_mutable_iterator<C> >::type type;

(我有 boost 1.51,但 1.52 没有列出任何更改,1.53 alpha 列出了两个错误修复,但似乎都不相关)

那么有没有更好的方法来检测范围呢?虽然我一直在使用一些 C++03 编译器,并且可能会持续很长一段时间,但我想让它能够轻松切换到 C++11(其中免费)begin and end通过 ADL 提供似乎就足够了)。

具体来说,编译器是 Visual C++ 9.0 和 GCC 4.5。 SFINAE 对这两方面的支持都足够。


我相信您需要使用的元功能是has_range_iterator http://www.boost.org/libs/range/doc/html/range/reference/concept_implementation/semantics/metafunctions.html.

在 LWS 上运行 http://liveworkspace.org/code/744iw%243

#include <iostream>
#include <string>
#include <utility>

#include <boost/range.hpp>

template <typename T>
typename boost::disable_if<boost::has_range_iterator<T> >::type repr(const T &, const std::string& name)
{ std::cout << name << " is not a range" << std::endl; }

template <typename T>
typename boost::enable_if<boost::has_range_iterator<T> >::type repr(const T &, const std::string& name)
{ std::cout << name << " is a range" << std::endl; }

struct foo{};
struct bar
{
   typedef int iterator;
    typedef const int const_iterator;
    int begin(){ return 0;};
    int end(){ return 1;};
};


int main()
{
    int i;
    repr(i, "int");
    int array[10];
    repr(array, "int array");
    std::string str;
    repr(str, "std::string");
    foo f;
    repr(f, "foo");
    bar b;
    repr(b, "bar");

    std::pair<int, int> p;
    repr(p, "pair"); // it does make a mistake here, because std::pair<int, int> looks like range, but int is not valid iterator (cannot be dereferenced)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 SFINAE 检测某物是否在(增强)范围内 的相关文章

  • Windows 10 Mobile (10.0.14393) 地理围栏后台任务 (LocationTrigger)

    自从10 0 14393 周年纪念更新 LocationTrigger似乎不起作用 我有 Windows Phone 8 1 应用程序 也适用于 UWP 应用程序 输出到的便携式库Windows Runtime Component图书馆 w
  • 通过增加索引之和来生成排序组合的有效方法

    对于启发式算法 我需要一个接一个地评估特定集合的组合 直到达到停止标准 由于它们很多 目前我正在使用以下内存高效迭代器块生成它们 受到 python 的启发 itertools combinations http docs python o
  • 在 C# Winforms 应用程序中嵌入 Windows XP 主题

    我有一个旧版 C Windows 窗体应用程序 其布局是根据 Windows XP 默认主题设计的 由于需要将其作为 Citrix 应用程序进行分发 该应用程序现在看起来像经典主题应用程序 因为 Citrix 不鼓励使用主题系统服务 所以
  • SFINAE 如何使用省略号?

    过去 当使用 SFINAE 选择构造函数重载时 我通常使用以下内容 template
  • 带 If 的嵌套 For 循环的时间复杂度

    void f int n for int i 1 i lt n i if i int sqrt n 0 for int k 0 k lt pow i 3 k do something 我的思考过程 执行if语句的次数 sum i 1 to
  • HttpWebRequest vs Webclient(特殊场景)

    我知道这个问题之前已经回答过thread https stackoverflow com questions 1694388 webclient vs httpwebrequest httpwebresponse 但我似乎找不到详细信息 在
  • 无法解析远程名称 - webclient

    我面临这个错误 The remote name could not be resolved russgates85 001 site1 smarterasp net 当我请求使用 Web 客户端读取 html 内容时 出现错误 下面是我的代
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • 如何在 C++ 中将 CString 转换为 double?

    我如何转换CString to a double在 C 中 Unicode 支持也很好 Thanks A CString可以转换为LPCTSTR 这基本上是一个const char const wchar t 在 Unicode 版本中 知
  • 从 Code::Blocks 运行程序时出现空白控制台窗口 [重复]

    这个问题在这里已经有答案了 当我尝试在 Code Blocks 中构建并运行新程序时 控制台窗口弹出空白 我必须单击退出按钮才能停止它 它对我尝试过的任何新项目 包括 Hello world 都执行此操作 奇怪的是 它对于我拥有的任何旧项目
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • 默认析构函数做了多少事情

    C 类中的默认析构函数是否会自动删除代码中未显式分配的成员 例如 class C public C int arr 100 int main void C myC new C delete myC return 0 删除 myC 会自动释放
  • tabcontrol selectedindex 更改事件未被触发 C#

    嘿伙计们 我有一个很小的问题 请参阅下面的代码 this is main load private void Form1 Load object sender EventArgs e tabAddRemoveOperator Selecte
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 如何引用解决方案之外的项目?

    我有一个 Visual Studio C 解决方案 其中包含一些项目 其中一个项目需要引用另一个不属于解决方案的项目 一开始我引用了dll
  • Visual Studio 2017 完全支持 C99 吗?

    Visual Studio 的最新版本改进了对 C99 的支持 最新版本VS2017现在支持所有C99吗 如果没有 C99 还缺少哪些功能 No https learn microsoft com en us cpp visual cpp
  • 在 C++17 中使用 成员的链接错误

    我在 Ubuntu 16 04 上使用 gcc 7 2 并且需要使用 C 17 中的新文件系统库 尽管确实有一个名为experimental filesystem的库 但我无法使用它的任何成员 例如 当我尝试编译此文件时 include
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • 类中不允许使用不完整类型,但类模板中允许使用不完整类型

    以下为无效代码 struct foo struct bar bar x error field x has incomplete type struct bar int value 42 int main return foo x valu

随机推荐

  • 无法处理的 POSIX 信号的返回代码

    This is regarding the application that runs on POSIX Linux environment Most signals e g Ctrl C signal 2 SIGINT and few o
  • 计算圆内的坐标

    我正在按钮中间画一个假想的圆圈 圆的半径是Height 2 if Height gt Width or Width 2 if Width gt Height 现在我必须计算这个圆圈中有哪些坐标 以像素为单位 这个想法是 如果例如鼠标光标悬停
  • 如何在 NSUserDefaults 中保存 NSMutableArrays

    我有 4 个带有单独数据的 NSmutablearrays 现在我需要将它们单独保存在 NSuserdefaults 中并单独检索它们 我怎样才能做到这一点 任何人都可以发布一些代码吗 提前谢谢你 数组的内容是什么 虽然 NSUserDef
  • abs() 与 fabs() 速度差异以及 fabs() 的优势

    我对 abs 和 fabs 函数进行了一些简单的测试 但我不明白使用 fabs 的优点是什么 如果是 1 较慢 2 仅适用于浮子 3 如果用在不同的类型上会抛出异常 In 1 timeit abs 5 10000000 loops best
  • DateTime.MinValue 和 SqlDateTime 溢出

    我不想验证txtBirthDate所以我想通过DateTime MinValue在数据库中 我的代码 if txtBirthDate Text string Empty objinfo BirthDate DateTime MinValue
  • 堆栈粉碎后的错误信息如何处理

    我的 C 程序在 Linux 上遇到一些问题 它在 Windows 上编译并运行得很好 Linux 终端返回以下信息 stack smashing detected student terminated Backtrace lib libc
  • Gradle 7 和 jitpack.io 在发布过程中遇到错误

    当我将 Android 项目升级到 Gradle 7 0 并想要在 jitpack io 中发布 aar 库时 我遇到了 Script script maven plugin gradle line 2 What went wrong A
  • Caliburn.Micro:从 IResult 中的异常中恢复

    这是张贴在Caliburn Micro 讨论 http caliburnmicro codeplex com Thread View aspx ThreadId 244394还 我真的在寻找有关最佳解决方法的建议和意见 假设我有以下操作 p
  • Rails jquery mobile 路由/渲染问题

    我正在关注教程http fuelyourcoding com getting started with jquery mobile rails 3 http fuelyourcoding com getting started with j
  • 使用“解决方案文件夹”组织 Visual Studio 解决方案

    当设置包含许多项目的 Visual Studio NET 解决方案时 您发现 解决方案文件夹 有用吗 有什么缺点 我最初的想法是 使用解决方案文件夹对于在解决方案中逻辑地组织类似项目很有用 然而 我惊讶地发现创建解决方案文件夹并没有创建相应
  • 表单身份验证 asp.net vb

    我有一个登录页面 它是主页 位于 www domainname com 当有人访问此页面时 它会在字符串中添加一个 returnurl 以便他们位于 www domainname com default aspx ReturnUrl 2f
  • 测量和监控 Node.JS 服务器性能 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么 HttpClient.PostAsync 似乎以 GET 而不是 POST 的方式发送请求?

    我一直在尝试使用发送 POST 请求没有主体的 HttpClient https stackoverflow com questions 7907648 post an empty body to rest api via httpclie
  • 计算 Dask 中过去 n 天的滚动平均值

    我正在尝试计算大型数据集过去 n 天 n 30 的滚动平均值 在 Pandas 中 我将使用以下命令 temp chunk groupby id code apply lambda x x set index entry time flat
  • 何时使用 Ruby 中启动子进程的每种方法

    1 反引号 定义于Kernel http www ruby doc org core classes Kernel src M001408 html 1 a x Percent X 定义在 parse y 中 参见讨论 https stac
  • React Webpack 生产错误

    我正在尝试为 React 15 3 2 应用程序设置 webpack 1 13 3 配置 并且我希望在我的生产版本中使用 React 的生产版本 我在 Windows 上 我正在使用这个 当你搜索时 它在网上随处可见 new webpack
  • Seam 2.2.0 URL 重写不起作用

    我正在尝试一个简单的 URL 重写示例 但它对我不起作用 我正在使用部署到 JBoss 5 1 0 的 Seam 2 2 0 我的pages xml 包含
  • 以可移植的方式读取 C++ 中的目录

    我有一个要求如下 我有一个目录 例如我有 tmp myFolder 在 myFolder 下 我有名称如下的文件 myFile N001 txt myFile N002 txt myFile N003 txt 在我的应用程序中 在写入文件时
  • C# 控制台应用程序将进程带到前台

    通过以下 C 控制台应用程序代码 我可以使用 Jenkins 在后台运行该进程 但现在我想在前台看到这个过程 我在这里做错了什么 System Runtime InteropServices DllImport User32 dll pri
  • 使用 SFINAE 检测某物是否在(增强)范围内

    对于日志记录代码 我想检测模板函数的给定参数是否可以使用以下工具进行迭代升压范围 http www boost org libs range doc html index html或不 显然 无论是否 我都需要实例化不同的代码 所以我需要