C ++,将两个参数包传递给构造函数

时间:2018-11-25 11:51:46

标签: c++ templates mixins

我有以下问题。我有一堂课(mixin),它有两个模板库。

template <typename T>
class Id
{
    using result = T;
};

template <typename Printer1, typename Printer2>
class SeveralPrinters : public Printer1, public Printer2
{
    template <typename... Args1, typename... Args2>
    SeveralPrinters(dummy, helper<Args1...>, helper<Args2...>,
                    typename Id<Args1>::result... args1,
                    typename Id<Args2>::result... args2)
        : Printer1(std::forward<Args1>(args1)..., std::forward<Args2>(args2)...)
    {}
public:
    template <typename... Args, typename = 
std::enable_if_t<!contains<dummy, Args...>::result>>
    SeveralPrinters(Args&&... args)
        : SeveralPrinters(dummy(), typename Printer1::ArgsCtor(), 
typename Printer2::ArgsCtor(), std::forward<Args>(args)...)
    {
    }
};

所有类的名称都是虚构的。因此,假设其第一个基数接受int作为构造函数参数,第二个基数接受double。我想做的是能够像SeveralPrinters那样调用SeveralPrinters(1, 2.)的构造函数。这里的问题是Args1Args2不是从helper结构推导出的,而是从在辅助结构之后传递的args推导的。如您所见,我试图将模板参数包装到Id结构中,但这没有帮助。我知道,它称为非推断上下文之类的东西,但我无法使其正常工作。任何人都可以提供帮助(如果可能的话),也许可以对此主题进行一些解释(为什么现在不起作用)。 基类的示例:

class BasicPrinter1
{
public:
    BasicPrinter1(int)
    {}
    void f()
    {
    }
    using ArgsCtor = helper<int>;
};

class BasicPrinter2
{
public:
    BasicPrinter2(int*)
    {}
    void g()
    {
    }
    using ArgsCtor = helper<int*>;
};

1 个答案:

答案 0 :(得分:3)

之所以不起作用,主要是因为WebElement assignWorkSpaceElement = chromeDriver.findElement(By.xpath("//input[@name='value[326071]' and @value='1' ]")); assignWorkSpaceElement.click(); 中的别名result private (类的默认可访问性),因此无法从{{ 1}},导致替换失败(Id),而没有其他可行的候选构造函数调用。您的代码中也有一些错字。

SeveralPrinters

DEMO


为了将参数完美地传递给基类,您应该声明参数数量(typename Id<Args1>::result)并使用以下实现:

template <typename T>
struct Id
{
    using result = T;
};

template <typename Printer1, typename Printer2>
class SeveralPrinters : public Printer1, public Printer2
{
    template <typename... Args1, typename... Args2>
    SeveralPrinters(dummy, helper<Args1...>, helper<Args2...>
                  , typename Id<Args1>::result... args1
                  , typename Id<Args2>::result... args2)
        : Printer1(std::forward<Args1>(args1)...)
        , Printer2(std::forward<Args2>(args2)...)
    {}

public:    
    template <typename... Args>
    SeveralPrinters(Args&&... args)
        : SeveralPrinters(dummy{}
                        , typename Printer1::ArgsCtor{}
                        , typename Printer2::ArgsCtor{}
                        , std::forward<Args>(args)...)
    {}
};

DEMO 2

还要注意,我是如何保护复制构造函数以免被转发引用构造函数遮盖的。