使用 SFINAE 和 void_t 区分类型

2024-01-15

我遇到了一些情况,我必须编写两个函数,其中一个应该使用原始类型调用,std::string。另一种应该用其他类型来调用。

到目前为止,我以工作解决方案结束:

template <typename...>
struct Void_t_helper {
    using type = void;
};

template <typename... Ts>
using Void_t = typename Void_t_helper<Ts...>::type;


template <typename T, typename = void>
struct Is_string : std::false_type {};

template <typename T> 
struct Is_string<T, Void_t<decltype (std::declval<T> ().c_str ())>> : std::is_same<decltype (std::declval<T> ().c_str ()), const char*>::type {};


template <typename T>
std::enable_if_t<Is_string<T>::value || std::is_arithmetic<T>::value, void> foo (T) {
    std::cout << "string or primitive\n";
}

template <typename T>
std::enable_if_t<!Is_string<T>::value && !std::is_arithmetic<T>::value, void> foo (T) {
    std::cout << "other type\n";
}

以及用法:

foo (1);
foo (1.2);
foo (std::string {"fsdf"});
foo (std::vector<int> {1, 2, 3});
foo (std::vector<std::string> {"a", "v", "c"});

按预期产生:

string or primitive
string or primitive
string or primitive
other type
other type

我的问题是:您知道解决此类问题的更好方法吗?

我不太确定是否检查c_str()存在是我能得到的更好的选择。我知道我可能可以编写一些用于原始类型和std::string会有一些category_t用值定义X,对于其他类型值Y并使用这个类别来区分这些群体,但我仍然认为c_str()检查更方便。


我不太确定检查 c_str() 是否存在是否是更好的选择。

理想情况下,您会检查您真正想要的东西。

它可以是一组已知类型或模板,也可以是concept.

目前,您正在检查“具有返回指向常量字符的指针的 c_str() 成员函数的概念”。

问题是,您的 SFINAE 函数需要什么概念?

如果它将使用c_str()会员,有道理。但是,如果要使用字符串的其他成员或类型,您可能需要构建一个复合概念来描述您将要使用的接口部分。

当然,您可能只是想确认它实际上是一个专业化std::string。除非您说明用例,否则很难(不可能)判断。

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

使用 SFINAE 和 void_t 区分类型 的相关文章

随机推荐

  • 使用 org.apache.commons.exec.DefaultExecutor 执行 shell 命令

    我想在java代码中执行这样的命令 gzip c tmp specificPreffix 2013 11 06 txt gt tmp specificPreffix 2013 11 06 txt gz 我的系统是RHEL5 我已经授予了文件
  • drupal sql 多个表的条件子句?

    我对常见问题解答搜索模块进行了以下查询 修改后可在 Drupal 7 中使用 它在两个表中搜索 1 标题2 正文但无法再包含一个 term strip tags drupal substr POST keyword 0 100 query
  • 不使用 zipWith 的斐波那契数

    我一直在尝试实现从 0 到 n 的斐波那契数列列表 而不使用惰性zipwith https hackage haskell org package base 4 14 1 0 docs Prelude html v zipWith方法 到目
  • 如何从 VIM 在新选项卡中打开终端?

    当我使用 4 个文件时 所有文件都在选项卡 VIM 中打开 我想保存更改并编译它 而不必关闭选项卡 即我想在新选项卡中与现有的 4 个选项卡一起打开一个终端 我应该如何在 VIM 中执行此操作 tab ter 打开一个终端在新标签中而不是在
  • 如何在 linq 中对子列表求和?

    我想对列表的子列表上的属性求和 示例 I have public class List1 public List
  • 修改列表删除元素而不造成混乱

    我现在正在尝试解决一个听起来像这样的任务 编写一个函数 modi la lb 它接受输入 2 列表 la 和 lb 其中的元素数量相同 该功能应该modify列出 la 和 lb 比较两个列表中具有相同索引的元素并删除较大的一个 如果元素相
  • 为什么 FLAC Streaming over HTTP 采用 Ogg 封装而不是原生封装?

    当前所有 FLAC 流媒体实现 例如 Edcast 和 Icecast 似乎都在流媒体时使用 Ogg 作为 FLAC 的容器 这是什么原因呢 有什么缺点not使用 Ogg 并改为流式传输 本机 FLAC 流 我已经做了一些通过 HTTP 传
  • 使用 EWS 的 PR_SEARCH_KEY

    我需要提取PR SEARCH KEY对于某些邮件使用EWS 我之前是使用 Outlook API 完成的 但我想在 EWS 中重新编写完整的代码 因为它非常强大 旧代码 private String GetLnksForMailBoxMai
  • 使用 C# 将 excel 转换为 JSON,并将 excel 中的第一行作为键

    我正在寻找从中读取数据excel 2010通过指定工作表名称 然后我想将数据转换为JSON格式 假设我有一个这样的 Excel 工作表 Name Age Country Waugh Timothy 10 UK Freeman Neil 20
  • JavaFX 3-D 条形图与 Java 8

    是否有使用现代 3 D API 的最新 Java 8 的 3 D 条形图示例 我想使用 Java 8 中的 3 D API JavaFX 的早期版本中有一个 3d Bar Chart 演示 但已被删除 您可以自己创建条形图 只需创建一个网格
  • 在 Silverlight 中迭代枚举?

    在 Net 中 可以使用以下方式迭代枚举 System Enum GetNames typeof MyEnum or System Enum GetValues typeof MyEnum 然而 在 Silverlight 3 中 未定义
  • Mobaxterm:如何防止 ssh 会话退出?

    我该如何阻止这个 Session stopped Press
  • SwiftUI 拖放文件

    我正在尝试向我的 SwiftUI Mac 应用程序添加 拖放 手势 功能 我想将文件从我的系统 桌面拖放到我的应用程序中 我发现在常规 Swift 中这是可能的 我现在正在尝试在 SwiftUI 中执行此操作 我找到一个onDrop Swi
  • UITableView didSelectRowAt 不称为 iOS 10,但适用于 9.3.5

    关于这个问题有很多问题 但到目前为止我找到的答案并不适用 在这种情况下 该表在 iOS 9 3 5 中正常工作 但不适用于 iOS 10 或 10 3 1 我已经排除了 没有正确设置委托 代表执行 3 个功能 didSelectRowAt
  • 我应该为所有内容编写单元测试吗?

    我想知道我是否应该为所有内容编写单元测试 有一些类很难编写单元测试 例如 我正在编写一些处理音频的程序 用于从麦克风捕获音频的类和用于向扬声器播放音频的类 我如何为这些类编写单元测试 我无法获得这些类的输出和输入 因此几乎不可能测试它们 我
  • 退出在子子程序中打开的 Word.Application

    我们宣布Word Application对象在Pro1下面的子函数 因为我们需要返回Word Document对象 应保持打开状态 我怎样才能退出父子例程中的Word应用程序 test01 我需要objWord声明于的对象Pro1函数将在没
  • Android SDK 中的虚拟摇杆

    我想在我的 Android 应用程序中制作一个虚拟操纵杆来控制遥控汽车 我怎样才能做到这一点 我可以使用 API 来执行此操作吗 我在网上查看的代码示例似乎不起作用 你可以看一下这个 很简单 有文档等 https github com co
  • 如何在 Visual Studio 2008 或 Visual Studio 2010 中设置 JavaScript 断点

    我正在尝试使用 Visual Studio 2010 调试 JavaScript 代码 但无法设置断点 我怎样才能做到这一点 我只是注意到了一些事情 每次我尝试调用一个函数 无论什么函数 在 JavaScript 中 不知何故jQuery
  • 如何通过命令行对 apk 进行签名

    请注意 我们已经在 Android SDK 的帮助下通过命令行创建了 apk 文件 现在 由于将其上传到 Google Play 商店 需要对 apk 进行签名 我们该怎么做呢 首先 您需要一个密钥库来开始该过程 您将使用此密钥库对您的 a
  • 使用 SFINAE 和 void_t 区分类型

    我遇到了一些情况 我必须编写两个函数 其中一个应该使用原始类型调用 std string 另一种应该用其他类型来调用 到目前为止 我以工作解决方案结束 template