首页 > 解决方案 > 模板类使用参数包时如何传递其他模板参数?

问题描述

我想创建模板类,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作为模板参数...

可能吗?怎么做?

标签: c++templatesc++14variadic-templatestemplate-meta-programming

解决方案


如您所见,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_)


推荐阅读