通过转发构造函数参数构建基于可变参数模板的 mixin

2024-04-09

我正在尝试构建一个 mixin 模板,其基础全部作为可变参数模板参数传递。我想通过将每个 mixin 类的构造函数参数作为参数传递给可变参数模板构造函数来构造 mixin

当使用每个 mixin 类类型的对象调用时,可变参数模板构造函数会进行编译。但是如果我传递每个 mixin 类的构造函数参数(所有类都有一个参数构造函数),它就不会编译

我正在使用 gcc 7.0 和 -std=c++1z

我究竟做错了什么?

 #include <vector>
 #include <string>
 #include <unordered_map>
 #include <iostream>

 template < typename... T >
 struct Mixin : T...
 {
     Mixin() = delete;
     Mixin(Mixin const &) = delete;
     Mixin(Mixin &&) = delete;

     template < typename... U >
     Mixin(U &&... v) : T(std::forward < U >(v))...
     {
     }
 };

 int main()
 {
     using A = std::vector < std::string >;
     using B = std::unordered_map < std::string, std::string >;
     using C = std::string;
     using M = Mixin < A, B, C >;

     //  This doesn't compile
     M m1{{"hello", "world"}, { {"hello",  "world" }, {"world",  "hello"} }, "hello"};

     //  This compiles
     A a({"hello", "world"}); B b({ {"hello",  "world" }, {"world",  "hello"} }); C c("hello");
     M m2{a, b, c};
 }

这里的问题是std::initializer_list不能从转发参考。事实上,明确指定std::initializer_list使您的代码编译:

M m1{
    std::initializer_list<std::string>{"hello", "world"}, 
    std::initializer_list<std::pair<const std::string, std::string>>{{"hello",  "world" },{"world",  "hello"} }, 
    "hello"};

魔杖盒示例 http://melpon.org/wandbox/permlink/eqRqGmU3sRPuqux8

您可以找到有关以下内容的更多信息std::initializer_list和扣除在这个问题中 https://stackoverflow.com/questions/12431495/initializer-list-and-template-type-deduction.


您可以强制扣除std::initializer_list通过创建一个助手make_il功能:

template <typename... Ts>
auto make_il(Ts&&... xs) 
{ 
    return std::initializer_list<std::common_type_t<Ts...>>{
        std::forward<Ts>(xs)...}; 
}

您的最终代码将如下所示:

using namespace std::literals::string_literals;          
using kvp = std::pair<const std::string, std::string>;

M m1{
    make_il("hello"s, "world"s), 
    make_il(kvp("hello"s,  "world"s), kvp("world"s,  "hello"s)), 
    "hello"};

魔杖盒示例 http://melpon.org/wandbox/permlink/EKjdtlIY2ZW912bl

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

通过转发构造函数参数构建基于可变参数模板的 mixin 的相关文章

  • 我应该把 try/catch 和“using”语句放在哪里? [复制]

    这个问题在这里已经有答案了 可能的重复 try catch using 正确的语法 https stackoverflow com questions 4590490 try catch using right syntax 我想try c
  • 在 C# 中使用“using”关键字避免多次处置的最佳实践

    当变量是 IDisposable 时 我们有using关键字来管理处置 但是如果我们在方法中返回值怎么办 using twice StringContent stringToStringContent string str using St
  • 无法将 std::min 传递给函数,std::min 的副本有效

    Passing std min函数无法编译 我复制了 libcpp 声明std min进入我的源文件并且它可以工作 std 版本有什么问题 clang 和 gcc 也会发生同样的情况 在 Godbolt 上测试 https godbolt
  • c# 从另一个类中的另一个静态事件引发事件

    需要帮助从另一个班级调用事件 我有已声明事件的课程 public class MxPBaseGridView GridView public event AddNewItemsToPopUpMenuEventHandler AddNewIt
  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • C# 处理标准输入

    我目前正在尝试通过命令行断开与网络文件夹的连接 并使用以下代码 System Diagnostics Process process2 new System Diagnostics Process System Diagnostics Pr
  • 如何以编程方式播放 16 位 pcm 数组 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个包含 16 位 pcm 值的短 数组 我希望能够在不添加任何标题 也不将任何文件保存到内存的情况下播放它 我知道我可能需要一个提供
  • 带有运算符语法的错误消息,但不带有函数语法的错误消息

    为什么我在调用 unary 时收到错误消息 使用运算符语法 如果我用函数语法调用它就可以了 现场演示 https godbolt org z j7AbeQ template
  • C# 编译器数字文字

    有谁知道 C 编译器数字文字修饰符的完整列表 默认情况下 声明 0 使其成为 Int32 声明 0 0 使其成为 Double 我可以在末尾使用文字修饰符 f 来确保某些内容被视为 Single 例如像这样 var x 0 x is Int
  • 有什么方法可以重载 C# 中的扩展方法吗?

    我有以下模型模式 public abstract class PARENTCLASS public class CHILD A CLASS PARENTCLASS public static class EXTENSION public s
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • 如何在win32中使用GetSaveFileName保存文件?

    我编写此代码是为了获取 fileName 来保存我的文件 include stdafx h include
  • 在 C# 中何时使用 ArrayList 而不是 array[]?

    我经常使用一个ArrayList而不是 正常 array 当我使用时 我感觉好像我在作弊 或懒惰 ArrayList 什么时候可以使用ArrayList在数组上 数组是强类型的 并且可以很好地用作参数 如果您知道集合的长度并且它是固定的 则
  • 通过 C# Mailkit / Mimekit 发送电子邮件,但出现服务器证书错误

    Visual Studio 2015 中的 0 代码 1 我正在使用 Mailkit 最新版本 1 18 1 1 从我自己的电子邮件服务器发送电子邮件 2 电子邮件服务器具有不受信任的自签名证书 3 我在代码中添加了以下两行 以忽略服务器证
  • Resharper:IEnumerable 的可能多重枚举

    我正在使用新的 Resharper 版本 6 在我的代码中的几个地方 它给一些文本加了下划线 并警告我可能存在IEnumerable 可能的多重枚举 我理解这意味着什么 并在适当的情况下采纳了建议 但在某些情况下 我不确定这实际上是一个大问
  • 将错误代码映射到 C++ 中的字符串

    将错误代码从枚举映射到字符串的更有效方法是什么 在 C 中 例如 现在我正在做这样的事情 std string ErrorCodeToString enum errorCode switch errorCode case ERROR ONE
  • C# 中的 C/C++ 代码编译器

    在 C 中 我可以使用下面的代码编译 VB 和 C 代码 但无法编译 C C 代码 有什么办法可以做到这一点吗 C 编译器 public void Compile string ToCompile string Result null st
  • 为什么 f(i = -1, i = -1) 是未定义的行为?

    我正在读关于违反评估顺序 http en cppreference com w cpp language eval order 他们举了一个令我困惑的例子 1 如果标量对象上的副作用相对于同一标量对象上的另一个副作用是无序的 则行为未定义
  • 浮点字节序?

    我正在为实时海上模拟器编写客户端和服务器 并且由于我必须通过套接字发送大量数据 因此我使用二进制数据来最大化可以发送的数据量 我已经了解整数字节顺序以及如何使用htonl and ntohl为了规避字节顺序问题 但我的应用程序与几乎所有模拟
  • 如何在c linux中收听特定接口上的广播?

    我目前可以通过执行以下操作来收听我编写的简单广播服务器 仅广播 hello int fd socket PF INET SOCK DGRAM 0 struct sockaddr in addr memset addr 0 sizeof ad

随机推荐

  • 通过扩展名限制可选文件[重复]

    这个问题在这里已经有答案了 如何通过扩展名限制可以使用 input type file 元素选择的文件 我已经知道接受属性 但在 chrome 中 它确实通过定义的最后一个 MIME 类型 在本例中为 gif 来限制文件 而 FF4 甚至不
  • 为什么需要EventSourcingHandler(在聚合对象中)?

    公平警告 我不知道我在做什么 所以即使问这个问题也可能会出错 我想要更新一个简单对象 聚合 的状态 然后向 UI 提供已更改对象的投影 这是我的聚合对象 命令处理程序存在 但此处未显示 Aggregate public class Widg
  • 具有二进制正文的 iOS swift post 请求

    我想从 iOS swift3 发出一个 POST 请求 该请求传递一大块原始字节作为正文 我做了一些实验 这让我认为以下方法有效 let url URL string https bla foo bar var request URLReq
  • 构建 LLVM 失败并显示空错误消息

    我正在尝试构建 LLVM 3 1 和 Clang 3 1 我遵循了入门指南铿锵的网站 http clang llvm org get started html 检查必要位置的存储库 获取 Python 等 如果我安装了 Python 3 3
  • Keras 文本预处理 - 将 Tokenizer 对象保存到文件中以进行评分

    我按照以下步骤 大致 使用 Keras 库训练了一个情感分类器模型 使用 Tokenizer 对象 类将文本语料库转换为序列 使用 model fit 方法构建模型 评估这个模型 现在 为了使用此模型进行评分 我可以将模型保存到文件中并从文
  • std::function 的运行时实现

    为了安全起见 我已经在 DLL 调用中使用旧式函数指针 如下所示 DLL typedef int stdcall ty void test ty t if t int r t 而我可以使用这个 void test std function
  • 通用工作单元

    我已经实现了 EntityFramework 模式以及存储库和工作单元 实现类似于代码项目存储库示例 http www codeproject com Articles 770156 Understanding Repository and
  • PHP readfile 与 file_get_contents

    我使用以下代码来生成 zip push to download the zip header Content type application zip header Content Disposition attachment filena
  • 为什么在 js 取消设置只读标签后,iOS 不显示键盘用于输入?

    我有一个UITextField in HTML表单设置为只读 输入时 javascript 应测试该字段当前是否正在由其他人编辑 如果不是 则只读将设置为 false 并允许编辑该字段 为此 我使用了 onFocus 事件 这在 Chrom
  • 带有 Like 语句的 OUTLOOK VBA 过滤器

    我想添加一个类似的声明 因为我想过滤以以下开头的电子邮件tmeadmin 这段代码与以下内容断线like陈述 我如何解决它 Dim objOutlook As Outlook Application Dim objNamespace As
  • 错误:无法确定当前字符,它不是 android 的 React-Native 中的字符串、数字、数组或对象

    每当我跑步时反应本机运行 Android在保持模拟器运行时 我收到此错误 反应本机运行 ios工作完全正常 Error Command failed gradlew app installDebug PreactNativeDevServe
  • CSS:将背景图像拉伸到屏幕的 100% 宽度和高度?

    我有一个名为 myImage jpg 的图像 这是我的CSS body background image url images myImage jpg background repeat no repeat background size
  • Python通过字符串名称导入子模块?

    如何使用字符串列表 子模块名称 来导入当前模块中的子模块 当前代码 from mainapp utils import firstutil from mainapp utils import secondutil from mainapp
  • 防止 Google Play 上的虚假评论 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我将 Android 应用程序发布到 Google Play 一切都很好 我收到了大约 5000 条用户评论 平均分为 4 6 分 但在某个时刻 我开
  • 如果 URL 参数很长,控制器操作不会调用

    仅供参考 我的问题不是重复的MVC 3 中的长 url 为 404 20 https stackoverflow com questions 20798392 404 20 for long url in mvc 3所以请不要混淆 我有一个
  • 谁在为kafka集群设置授权

    我有一个 3 节点 Kafka 集群和 2 个用于生产者和消费者的 kafka 客户端 我已启用 SSL 身份验证 我想为集群启用授权 我已在代理节点的 server properties 中添加了以下属性 authorizer class
  • 检测不同分辨率下的图像相等性

    我正在尝试构建一个脚本来浏览我的原始高分辨率照片 并替换我在拥有专业帐户之前上传到 Flickr 的旧的低分辨率照片 对于其中许多 我可以只使用 Exif 信息 例如拍摄日期 来确定匹配 但有些确实很旧 要么原始文件没有 Exif 信息 要
  • 如何使用java从linux环境获取tomcat中当前目录的相对路径

    我想用来从我的网络应用程序外部读取属性文件 我在 Windows 环境中的 tomcat 中部署了一个 war 文件 并且可以使用以下代码从 Web 应用程序外部读取属性文件 Method 1 String filePath new jav
  • Android OpenCV 并行化循环

    我知道 OpenMP 包含在 NDK 中 使用示例如下 http recursify com blog 2013 08 09 openmp on android http recursify com blog 2013 08 09 open
  • 通过转发构造函数参数构建基于可变参数模板的 mixin

    我正在尝试构建一个 mixin 模板 其基础全部作为可变参数模板参数传递 我想通过将每个 mixin 类的构造函数参数作为参数传递给可变参数模板构造函数来构造 mixin 当使用每个 mixin 类类型的对象调用时 可变参数模板构造函数会进