我有一个问题。我有一个类(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(1, 2.)
这样调用SeveralPrinters
的构造函数。问题在于,Args1
和Args2
不是从helper
结构中推导出来的,而是从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*>;
};
helper
结构体来推断它们。 - Piotr Skotnicki