是否有合法的方法使用运算符 << 打印元组和对?

2024-07-01

我有一组模板/函数,允许我打印元组/对,假设元组/对中的每种类型都有operator<<为其定义的。不幸的是,由于 17.4.3.1,添加我的内容是非法的operator<<重载到std。有没有其他方法可以让 ADL 找到我的operator<<?如果没有,将我的超载包裹起来有什么实际危害吗?namespace std{}?

任何感兴趣的人的代码:(我正在使用 gcc-4.5)

namespace tuples {
  using ::std::tuple;
  using ::std::make_tuple;
  using ::std::get; 
namespace detail {

template< typename...args >
size_t size( tuple<args...> const& )
{
  return sizeof...(args);
};

template<size_t N>
struct for_each_ri_impl
{
  template<typename Func, typename Tuple>
  void operator()(Func func, Tuple const& arg)
  {
    for_each_ri_impl<N-1>()(func, arg );
    func( get<N>( arg ), size(arg) - N - 1 );
  }
};

template<>
struct for_each_ri_impl<0>
{
  template<typename Func, typename Tuple>
  void operator()(Func func, Tuple const& arg)
  {
    func( get<0>( arg ), size(arg) - 1 );
  }
};
}//detail

template<typename Func, typename ... Args>
void for_each_ri( tuple<Args...>const& tup, Func func )
{
  detail::for_each_ri_impl< sizeof...(Args)-1>()( func, tup );
}


struct printer {
  std::ostream& out;
  const std::string& str;
  explicit printer( std::ostream& out=std::cout, std::string const& str="," ) : out(out), str(str) { }

  template<typename T>void operator()(T const&t, size_t i=-1) const { out<<t; if(i) out<<str; }
};

//Should this next line go into namespace std? Is there another way?
template<typename ... Args>
std::ostream& operator<<(std::ostream& out, std::tuple< Args... > const& tup)
{
  out << '[';
  tuples::for_each_ri( tup, tuples::printer(out,", ") );
  return out << ']';
}

} //tuples

//Edits --
int main()
{
using namespace std;

cout<<make_tuple(1,'a',"Hello")<<endl;

return 0;
}

编译以上结果:

test.cpp:在函数“int main()”中:
test.cpp:69:31:错误:无法将 'std::ostream' 左值绑定到 'std::basic_ostream&&' > /opt/local/include/gcc45/c++/ostream:579:5:错误:初始化参数 1 'std::basic_ostream<_chart _traits>& std::operator&&, const _Tp&) [其中 _CharT = char, _Traits = std::char_traits, _Tp = std::元组]'


将您自己的轻量级包装类放在它周围,然后重载operator

    template< typename ...VA_ARGS >
    struct format_tuple
    {
       typedef tuple<VA_ARGS...> tuple_type;
    // any format variables
       const tuple_type & tup;
       format_tuple( const tuple_type& t): tup(t) {}
    };

    template< typename ...VA_ARGS > format_tuple<VA_ARGS...> makeFormatTuple( const tuple<VA_ARGS...> & t ) 
    {
       return format_tuple( t );
    }

    template<typename ...VA_ARGS>
    std::ostream& operator<<( std::ostream& os, const format_tuple<VA_ARGS...> & ft ) 
    {
      // original implementation
    }

这是一个大纲,因为我不确定如何使用可变参数模板来完成它,尽管它应该是可能的。您可以使用 1、2、3 等参数轻松实现多个版本,例如:

    template<typename T1, typename T2, typename T3>
    class format_tuple_3; //etc


    template<typename T1, typename T2, typename T3>
    format_tuple_3<T1, T2, T3> makeFormatTuple( tuple<T1,T2,T3> const&); //etc
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否有合法的方法使用运算符 << 打印元组和对? 的相关文章

  • 如何管理 JSONP 响应中的 ' ?

    我需要像这样管理 char 在我的 JSONP 请求中 通过 jquery 使用 Ajax 所以 来自 C 这就是我所做的 myText Hello I m a string myText Replace Response Write Re
  • 在 OpenCV C++ 中使用 gpu::GpuMat

    我想知道如何修改gpu GpuMat 事实上我想知道是否可以使用gpu GpuMat like a cv Mat 我想做这样的事情 cv namedWindow Result cv Mat src host cv imread lena j
  • 空别名共享指针是否是无操作删除共享指针的良好替代方案?

    有时我需要shared ptr具有无操作删除器的实例 因为 API 期望shared ptr例如 它想要存储有限的时间 但我得到了一个原始指针 不允许我拥有比我运行的时间更长的时间 对于这种情况 我一直使用无操作删除器 例如 const v
  • 在 C# 中创建新 List 的这三种方式有什么区别?

    这三种创建新的方式有什么区别List
  • 当找到路由/url 但未找到其背后的资源时返回什么?

    当路由customer 1存在但customer搜索背后的资源 实体不存在时 我应该返回 404 吗 我的意思是路线存在 或者我应该返回一个 204 无内容 因为我找不到客户 结果为空 微软样本 public IHttpActionResu
  • 为什么 C# 三元运算符不能与委托一起使用?

    当分支选择函数时 使用三元运算符来选择函数可能是有意义的 但这是不可能的 为什么 public class Demo protected bool branch protected void demo1 protected void dem
  • 我应该如何继承IDisposable?

    为了保护无辜者 班级名称已更改 如果我有一个名为 ISomeInterface 的接口 我还有继承该接口的类 FirstClass 和 SecondClass FirstClass 使用必须处置的资源 二等舱没有 那么问题来了 我应该从哪里
  • 使用迭代器与索引访问向量元素有什么区别?

    使用迭代器与索引访问向量元素有什么优点 为什么迭代器比索引更好 在索引不可用的情况下 例如 std list 对于 例子 在通用函数接受迭代器的情况下 叫做 编写应该使用的函数模板时 不止一种容器类型 他们的存在是为了创造均匀性在所有容器和
  • 将“列表”项附加到 StringBuilder

    我尝试将项目附加到List
  • 在哪里可以查看 LINQ 源代码?

    我需要编写自己版本的 except 方法 或者至少以某种方式修改 LINQ 方法的工作方式 我正在与大型自定义对象列表进行比较 并且需要将匹配项从列表 A 连接到列表 B 我认为除外哈希表构建是进行比较的最快方法 但该方法只会返回非匹配项
  • 如何从源代码编译picoProlog?

    我是计算机科学专业的学生 正在学习 Prolog 逻辑编程 我发现了一个有趣的 Prolog 解释器 picoProlog http spivey oriel ox ac uk corner Logic Programming http s
  • 如何在类型依赖于派生类的基模板类中声明成员?

    给定一个使用 CRTP 的基类 我正在考虑在基模板类中声明一个成员 其中类型依赖于派生类 虽然以下内容按预期工作 template
  • C# 我可以访问没有完整限定名称的枚举吗

    我有一个 C 枚举类型 它以非常长的限定名称结尾 例如 DataSet1 ContactLogTypeValues ReminderToFollowupOverdueInvoice 为了便于阅读 如果我可以告诉一个特定的函数只使用名称的最后
  • 在 C++ 中调用函数有多少开销?

    许多文献都谈到使用内联函数来 避免函数调用的开销 但我还没有看到可量化的数据 函数调用的实际开销是多少 即通过内联函数我们可以实现什么样的性能提升 在大多数架构上 成本包括将所有 或部分 或没有 寄存器保存到堆栈 将函数参数推送到堆栈 或将
  • 在heroku上运行c++程序

    我正在尝试在 Heroku 上运行 C 程序 我读过这篇文章 但是我没能成功 因为服务器上没有 g 或 gcc 我尝试像这样将 g 下载到服务器上sudo apt get install g 但是我没有root权限 我还尝试将 g 副本复制
  • 如何为 Office AddIn 创建静默安装程序

    我在为使用 C 中的 VSTO 开发的 Outlook 加载项创建静默安装程序时遇到问题 安装程序是由 clickOnce 生成的 Outlookaddin vsto 此加载项将由 SCCM 在多台计算机上发布 我需要静默安装 但当软件包到
  • 如何将 ContextMenuStrip 添加到 ToolStripMenuItem

    我希望当我单击菜单项时 显示一个包含 删除 重命名 等项目的上下文菜单 当右键单击菜单项时 如何将自身绑定为上下文菜单 我脑海中跳出的第一个想法是连接一些MouseDown事件于ToolStripMenuItem并显示第二个ContextM
  • 跨 Web 服务列表<国家/地区> 变为国家/地区 []

    我有一个 Web 服务 调用时会返回一个包含多态列表的 Result 对象 但是 当我在客户端应用程序中添加引用时 公共字段将成为客户端应用程序中的国家 地区数组 如何将客户端应用程序中的字段更改为列表 public Result GetC
  • 从构造函数调用虚函数[重复]

    这个问题在这里已经有答案了 我正在阅读有效的C https en wikipedia org wiki Scott Meyers 还有 第 9 条 在构造或销毁期间切勿调用虚函数 我想知道我的代码是否正确 即使它违反了这条规则 using
  • 如何防止禁用的 ToolStripMenuItem 在鼠标悬停时显示边框?

    Yes exactly same as the title in my project some of toolstripmenuitems were disabled But when i bring the cursor over th

随机推荐

  • 默认情况下,所有 Google Chrome 扩展程序都是开源的吗?

    我想知道如果我编写了 Google Chrome 扩展程序 任何人都可以使用我的代码吗 看起来人们将能够看到您的代码 如果他们可以看到您的代码 他们就有可能使用它 视窗 C Documents and Settings USERNAME L
  • 如何在 PL/SQL 中解析逗号分隔的字符串? [复制]

    这个问题在这里已经有答案了 我在 PL SQL 脚本中有一个逗号分隔的字符串 例如 data a b c d e 我需要在脚本中解析它 我想循环遍历字符串并处理每个项目 就像 foreach 循环一样 这在 PL SQL 中可能吗 有人可以
  • 如何从一个活动组中的活动导航到android中的另一个活动

    我有两个标签 在这两个选项卡中我有不同的活动组 如何从一个活动组中的一个活动导航到android中的另一个活动 请帮我举出合适的例子 就我而言 我确实喜欢这样 当我单击父组最后一个活动中的完成 提交按钮时 我提交了值 将值存储到服务器 数据
  • 在 PHP 中格式化 JSON 格式的文本文件

    所以我得到了一个带有按钮的 HTML 页面 当我单击该按钮时 一个单独的 javascript 文件会向我的 PHP 文件发送 GET 请求 并期望返回 JSON 对象 我的 PHP 读取 JSON 格式的文本文件 并将其转换为 JSONO
  • ASP.NET身份更改密码

    我需要能够由管理员更改用户密码 因此 管理员不应输入用户的当前密码 他应该能够设置新密码 我查看了 ChangePasswordAsync 方法 但该方法需要输入旧密码 因此 此方法不适合此任务 因此我通过以下方式做到了 HttpPost
  • 在 App Store 上发布应用程序后,iAd 未在设备上显示

    检查了有关在 App Store 上发布应用程序后不显示 iAd 的几个问题 对 iAd 进行所有必要的设置 测试广告在模拟器和设备中显示良好 然后发布应用程序并为该应用程序启用 iAd 网络 在iAd Network部分 状态显示为 Li
  • Xcode 4:如何更改 ${EXECUTABLE_NAME} 变量的值?

    我想找到 xcode 4 2 中定义的 EXECUTABLE NAME 全局变量在哪里 您的目标 gt 构建设置 gt 产品名称
  • RSpec 中“it”关键字的作用是什么?

    我正在关注rails3tutorial 在进行如下测试时 我不明白 it 关键字的含义 require spec helper describe UsersController do render views describe GET ne
  • 在android中绘制单点触摸运动路径

    我正在尝试制作一个绘图应用程序 我想要绘制单点触摸运动路径在 android 中 就像 Swype 键盘的方式一样 因此我想存储每个像素的 x y 坐标将运动路径转化为数据结构 我如何使用 MotionEvent 指针来执行此操作 您可能不
  • 使用自定义源增强 Iostreams zlib_error

    我正在尝试使用zlib decompressor通过一个解压缩数据istreambuf iterator 我找不到使用输入迭代器作为流的输入的内置方法 如果已经存在 请指出一种方法 所以我写了这个源代码 template
  • JDK:如何以编程方式启用 PlatformLogger

    我需要以编程方式启用某些 JDK7 内部类的日志记录 这就是我在应用程序初始化时所做的事情 httpLogger Logger getLogger sun net www protocol http HttpURLConnection ht
  • SFINAE 在返回类型中工作,但不作为模板参数[重复]

    这个问题在这里已经有答案了 我已经使用过 SFINAE 习语很多次了 而且我习惯了把我的std enable if lt gt 在模板参数中而不是在返回类型中 然而 我遇到了一些微不足道的情况 它不起作用 我不知道为什么 首先 这是我的主要
  • 如何在wpf datagrid中显示数据集的相关数据

    我有一个包含两个表的数据集 存在简单的一对多父子关系 例如 Parent Table ParentId int Name string Child Table ChildId int ParentId int Name string 在此数
  • 异步方法调用和模拟

    为什么模拟用户上下文仅在异步方法调用之前可用 我编写了一些代码 实际上基于 Web API 来检查模拟用户上下文的行为 async Task
  • x64 DLL 导出函数名称

    我正在尝试将 32 位 dll 和应用程序 移植到 64 位 并且我成功地构建了它而没有错误 当尝试使用我的 64 位应用程序加载它时 我注意到导出的函数名称不同 这就是我导出函数的方式 ifdef cplusplus extern C e
  • 阻止 Firefox 在刷新后恢复先前用户输入的状态

    我有一个带有多个复选框的页面 需要表示数据库中的状态 这些复选框是 AJAX 驱动的 因此当选中一个复选框时 就会发送一个请求来更新数据库中的状态 如果他们的视图已过时 则受影响 相关复选框的视图将更新 并通知用户 并且必须重试 当我刷新时
  • 在本地运行 Cloud Functions 会出现错误“functions.config() 不可用”

    Cloud Functions for Firebase 最近刚刚发布 我正在按照全新安装的说明进行操作 这是 开始 页面 https firebase google com docs functions get started 我已经安装
  • 如何防止 python 请求对我的 URL 进行百分比编码?

    我正在尝试使用 python 中的 requests get 获取以下格式的 URL usr local bin python import requests print requests versiom url http api exam
  • startActivity 无法在 fcm 中的 onMessageReceived 内工作

    我知道有很多帖子讨论这个问题 我已经尝试了该线程上的几乎所有解决方案 但不幸的是这对我的情况不起作用 基本上 我想做的是 我想在之后立即开始一项活动onMessageReceived被调用而不发出通知 这是我的代码 override fun
  • 是否有合法的方法使用运算符 << 打印元组和对?

    我有一组模板 函数 允许我打印元组 对 假设元组 对中的每种类型都有operator lt lt 为其定义的 不幸的是 由于 17 4 3 1 添加我的内容是非法的operator lt lt 重载到std 有没有其他方法可以让 ADL 找