c++ - 模板类使用参数包时如何传递其他模板参数?
问题描述
我想创建模板类,print()
为作为模板参数传递的每种类型实现方法。
像这样的东西:
class Interface
{
public:
virtual ~Interface() = default;
virtual void print(int) = 0;
virtual void print(double) = 0;
};
X x<int, double, Interface>;
class X
有公共方法void print()
并且有效。
整个代码如下:
#include <iostream>
#include <type_traits>
struct Printer
{
void print(int i) {std::cout << i << std::endl; }
void print(double d) {std::cout << d << std::endl; }
};
class Interface
{
public:
virtual ~Interface() = default;
virtual void print(int) = 0;
virtual void print(double) = 0;
};
template <typename... Args>
class X;
template <typename Interface>
class X<Interface> : public Interface
{
static_assert(std::is_abstract<Interface>::value, "Last argument should be an interface");
public:
X(Printer printer) {}
using Interface::print;
};
template <typename Arg, typename... Args>
class X<Arg, Args...> : public X<Args...>
{
using Parent = X<Args...>;
public:
using Parent::print;
X(Printer printer_): Parent(printer), printer{printer_} {}
void print(Arg arg) override { printer.print(arg); }
private:
Printer printer;
};
int main()
{
Printer printer;
X<double, int, Interface> x(printer);
x.print(5);
}
如您所见,class X
使用Printer
类,但问题是我想将其Printer
作为模板参数...
可能吗?怎么做?
解决方案
如您所见,X 类使用 Printer 类,但问题是我希望将 Printer 作为模板参数...
可能吗?怎么做?
抱歉,但是......我没有看到问题(Story Teller 建议做了一个很大的简化:将单个Printer
物体放在地面案例中)
template <typename...>
class X;
template <typename Printer, typename Interface>
class X<Printer, Interface> : public Interface
{
static_assert(std::is_abstract<Interface>::value,
"Last argument should be an interface");
public:
X (Printer p0) : printer{p0}
{ }
using Interface::print; // why?
protected:
Printer printer;
};
template <typename Printer, typename Arg, typename... Args>
class X<Printer, Arg, Args...> : public X<Printer, Args...>
{
using Parent = X<Printer, Args...>;
public:
using Parent::print;
using Parent::printer;
X(Printer printer_): Parent{printer_} {}
void print(Arg arg) override { printer.print(arg); }
};
// ....
X<Printer, double, int, Interface> x(printer);
题外话:注意:您使用的是printer
未初始化的
X(Printer printer_): Parent(printer), printer{printer_} {}
我想你应该写Parent(printer_)
推荐阅读
- javascript - 动态 - 触发检查必填字段而不保存
- python - 旧 python 脚本的问题
- c# - 在 Teams 机器人中发送打字活动失败 - BadGateway
- python-3.x - Pandas 将 csv 数据转换为浮点数
- python - 在 Python 3 中解压 pandas/numpy 时出现内存泄漏
- r - 在 R 中使用类似 dplyr 的命令来组织栅格数据
- r - ggplot 订购一个聚集的条形图
- android-studio - RxJava 中@CheckReturnValue 的正确用法是什么?
- gradle - ML Gradle task.Server.Eval.Task 使用 xquery 设置变量
- nativescript - 为什么我不能更新到最新版本的 nativescript-theme (nativescript)