Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >元生成的可变接口实现

元生成的可变接口实现
EN

Stack Overflow用户
提问于 2020-03-30 06:25:18
回答 2查看 33关注 0票数 0

我已经用模板化的可变列表定义了接口,以便有多个方法匹配每种类型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename T> struct IfaceElement { virtual void m(const T &) = 0; };
template <typename... Ts> struct Iface : IfaceElement<Ts>... {};

我想要实现的是有一个不同数量的Event对象的接口。类似于:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct A {};
struct B {};
struct Handler : Iface<A, B> {
    void m(const A &) override { ... }
    void m(const B &) override { ... }
}

它工作得很好。

然而,我也希望有一个实现该接口的类,它也是从可变模板元生成的。

我认为像这样的东西应该是可行的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename T> struct IfaceElement { virtual void m(const T &) = 0; };
template <typename... Ts> struct Iface : IfaceElement<Ts>... {};

template <typename T> struct ImplElement : IfaceElement<T> {
    void m(const T &) override {}
};
template <typename... Ts> struct Impl : Iface<Ts...>, ImplElement<Ts>... {};

struct Z {};
struct X {};

Impl<Z, X> q;

但是我有一个编译器错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
test.cpp:121:12: error: cannot declare variable 'q' to be of abstract type 'Impl<Z, X>'
  121 | Impl<Z, X> q;
      |            ^
test.cpp:116:34: note:   because the following virtual functions are pure within 'Impl<Z, X>':
  116 | template <typename... Ts> struct Impl : Iface<Ts...>, ImplElement<Ts>... {};
      |                                  ^~~~
test.cpp:110:58: note:  'void IfaceElement<T>::m(const T&) [with T = X]'
  110 | template <typename T> struct IfaceElement { virtual void m(const T &) = 0; };
      |                                                          ^
test.cpp:110:58: note:  'void IfaceElement<T>::m(const T&) [with T = Z]'

我的ImplElement实现似乎与IfaceElement纯方法不匹配。

你知道我该怎么解决这个问题吗?

EN

回答 2

Stack Overflow用户

发布于 2020-03-30 06:25:18

我已经明白了这一点,需要虚拟继承来匹配这些接口。

编译代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename T> struct IfaceElement { virtual void m(const T &) = 0; };
template <typename... Ts> struct Iface : virtual IfaceElement<Ts>... {};

template <typename T> struct ImplElement : virtual IfaceElement<T> {
    void m(const T &) override {}
};
template <typename... Ts> struct Impl : Iface<Ts...>, ImplElement<Ts>... {};

struct Z {};
struct X {};

Impl<Z, X> q;
票数 0
EN

Stack Overflow用户

发布于 2020-03-30 07:12:29

您从IfaceElement继承了2次。一次通过ImplElement,一次通过Iface

这意味着

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename... Ts> struct Impl : Iface<Ts...>, ImplElement<Ts>... {};

每个Ts将有两个相同的IfaceElement

您可以通过使用虚拟继承来创建它,但是为什么需要从同一基址继承两次呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename... Ts> struct Impl : ImplElement<Ts>... {};

也将在每个Ts中只工作一次并从IfaceElement继承。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60925106

复制
相关文章
IDEA class实现Serializable接口生成 serialVersionUID
让你的类实现implements Serializable接口,然后在鼠标光标放在类名尚,Alt + Enter,就会提示你生成serialVersionUID了。
收心
2023/05/25
5770
IDEA class实现Serializable接口生成 serialVersionUID
生成元
算法竞赛入门经典第二版p52 例题3-5: 如果x+x的各个数字之和得到y,就是说x是y的生成元。给出n(1<=n<=100000), 求最小生成元。无解输出0.例如,n=216,121,2005时的解分别是198,0,1979. 利用打表法: 代码:
谙忆
2022/11/25
3360
生成元
如果x加上x的各个数字之后得到y,就说x是y的生成元。给出n(1<=n<=100000),
Vincent-yuan
2020/05/26
5411
Java 实现智能化生成接口【一】
实现智能化生成接口
爱明依
2022/04/01
2030
Java 实现智能化生成接口【一】
Java-不可变类的实现
不可变类: 所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的很多不可变类:Interger、Long和String等。 可变类: 相对于不可变类,可变类创建实例后可以改变其成员变量值,开发中创建的大部分类都属于可变类。
Fisherman渔夫
2019/07/31
1.3K0
人人皆可二次元!小姐姐生成不同风格动漫形象,肤色、发型皆可变
机器之心报道 编辑:杜伟、陈萍 一张输入人脸图像,竟能生成多样化风格的动漫形象。伊利诺伊大学香槟分校的研究者做到了,他们提出的全新 GAN 迁移方法实现了「一对多」的生成效果。 在 GAN 迁移领域,研究人员可以构建一个以人脸图像为输入并输出人脸动漫形象的映射。相关的研究方法已经出现了很多,如腾讯微视此前推出的迪士尼童话脸特效等等。 在迁移过程中,图像的内容(content)部分可能会被保留,但风格(style)部分必须改变,这是因为同一张脸在动画中能以多种不同的方式表示。这意味着:迁移过程是一个一对多的映
机器之心
2023/03/29
4360
人人皆可二次元!小姐姐生成不同风格动漫形象,肤色、发型皆可变
C++ 实现可变参数
一般形式都是 type func(char * formatstr,...); 然后通过已有的参数 formatsrr 来推出,后面的参数。 这样写起来的话,就要匹配所有的基本类型,C++提供了3个宏和算法可以简单处理。 这样,通过vsprintf_s就格式化到buf中。 #include <iostream> #include <stdarg.h> void print(char * formatstr,...) { char buf[1024] = {0}; va_lis
forxtz
2020/10/10
5290
Express实现生成二维码接口
// 引入模块 const express=require('express'); const QRCode=require('qr-image'); // 生成服务器 var server=exp
越陌度阡
2020/11/26
8010
举例分析可变参数函数实现的过程
函数栈调用 对于C语言,其调用遵循_cdecl规则: 1.所有参数从右到左依次入栈。 2.这些参数由调用者清除,称为手动清除。 3.被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。(简化的将就是调用参数的类型和数量不会产生编译阶段的错误)
lexingsen
2022/02/24
5520
举例分析可变参数函数实现的过程
POSTMAN自动生成接口文档_swagger自动生成接口文档
drf-spectacular是为Django REST Framework生成合理灵活的OpenAPI 3.0模式。它可以自动帮我们提取接口中的信息,从而形成接口文档,而且内容十分详细,再也不用为写接口文档而心烦了
全栈程序员站长
2022/09/19
2.4K0
POSTMAN自动生成接口文档_swagger自动生成接口文档
Java中实现不可变Map
有时最好不允许修改 java.util.Map, 例如跨线程共享只读数据。为此,我们可以使用Unmodifiable Map或Immutable Map。
lyb-geek
2018/12/26
5.1K0
如何优雅的生成接口文档?
  我们知道在项目开发阶段,接口文档基本上是必备产物了,一般由后端开发人员提供,作为和前端人员进行前后端接口联调的桥梁,或者与别的项目模块进行交互提供指导等等,接口文档的准确性,实时性,详细与否等,都会极大的影响前面的操作。那么如何才能优雅的生成接口文档呢?
IT可乐
2019/10/11
1.6K0
如何优雅的生成接口文档?
接口工具——ApiPost快速生成接口文档
工具下载地址:https://console.apipost.cn/register?utm_source=10009 发送HTTP请求 API界面功能布局 API请求参数 Header 参数 你可以
zyf20010801
2022/06/13
1.7K0
[Flask] 生成flask接口文档
背景 接触过几个针对flask自动生成接口文档的,但是感觉不太好用,然后发现了flask-docs,地址:https://github.com/kwkwc/flask-docs 但是感觉还是不太好用,就进行了魔改 地址 https://gitee.com/heanny/flask-docs 添加的功能 可修改接口文档分类为中文 接口文档页面布局进行了优化美观 生成接口文档的方法进行了重构,并添加了部分兼容逻辑 添加了二级分类树 添加了html网页类型展示 修复部分问题 文档接口搜索已修复 测试页面接口及搜
一朵灼灼华
2022/08/05
2.4K0
[Flask] 生成flask接口文档
基于可变自动编码器(VAE)的生成建模,理解可变自动编码器背后的原理
生成模型是机器学习中一个有趣的领域,在这个领域中,网络学习数据分布,然后生成新的内容,而不是对数据进行分类。生成建模最常用的两种方法是生成对抗网络(GAN)和可变自编码器(VAE)。在这篇文章中,我将尝试解释可变自动编码器(VAE)背后的原理,以及它是如何生成上述面的数据的。
deephub
2020/10/19
1.6K0
基于可变自动编码器(VAE)的生成建模,理解可变自动编码器背后的原理
swagger生成接口文档
OpenAPI规范(OpenAPI Specification 简称OAS)是Linux基金会的一个项目,试图通过定义一种用来描述API格式或API定义的语言,来规范RESTful服务开发过程,目前版本是V3.0,并且已经发布并开源在github上。
周杰伦本人
2022/10/25
1.3K0
C# WPF从后台代码生成行列可变的表格
WPF常用的表格控件是DataGrid,这个控件在前台XAML编写的话,一般列已经固定,然后给每个列去绑定数据,但是如果我的列不固定,随着运算结果变动呢?这时候DataGrid,就比较难实现这个需求,这节我就从后台代码去添加控件去实现这个功能.
用户9127601
2022/06/09
9590
C# WPF从后台代码生成行列可变的表格
PHP的可变变量与可变函数
什么叫可变。在程序世界中,可变的当然是变量。常量在定义之后都是不可变的,在程序执行过程中,这个常量都是不能修改的。但是变量却不同,它们可以修改。那么可变变量和可变函数又是什么意思呢?很明显,就是用另一个变量来定义他们,这个变量是可变的呀!
硬核项目经理
2020/01/22
1.2K0
可变与不可变
Python中的可变和不可变数据类型对于新程序员来说是很头疼的事情。 简而言之,可变意味着“可以改变”,而不可变意味着“不变”。看看这个例子
Helloted
2022/06/07
4500
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 实现 GroovyInterceptable 接口 | 重写 invokeMethod 方法 )
定义 Groovy 类时 , 令该类实现 GroovyInterceptable 接口 , 该 GroovyInterceptable 接口继承自 GroovyObject 接口 ,
韩曙亮
2023/03/30
3940
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 实现 GroovyInterceptable 接口 | 重写 invokeMethod 方法 )

相似问题

Kotlin :由可变类实现的具有不可变属性的接口

10

如何动态生成接口的实现

11

生成实现接口的JAXB类

7101

JAXB生成的类实现接口

21

Groovy使类通过元编程实现接口。

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文