我有以下问题。我有一堂课(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.)
的构造函数。这里的问题是Args1
和Args2
不是从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*>;
};
答案 0 :(得分:3)
之所以不起作用,主要是因为WebElement assignWorkSpaceElement = chromeDriver.findElement(By.xpath("//input[@name='value[326071]' and @value='1' ]"));
assignWorkSpaceElement.click();
中的别名result
是 private (类的默认可访问性),因此无法从{{ 1}},导致替换失败(Id
),而没有其他可行的候选构造函数调用。您的代码中也有一些错字。
SeveralPrinters
为了将参数完美地传递给基类,您应该声明参数数量(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)...)
{}
};
还要注意,我是如何保护复制构造函数以免被转发引用构造函数遮盖的。