假设我有一个模板类base
和一个班级wrapper
其中包含一个实例化成员base
。我想定义班级wrapper
这样它依赖于模板参数包,该参数包只是“传递”给实例化成员base
.
例如,考虑下面的代码,它工作得很好。
#include <iostream>
template <int i, int j>
struct base {
base()
{
std::cout << "i is " << i;
std::cout << " j is " << j << std::endl;
}
};
template <int... T>
struct wrapper {
base<T...> a;
};
int main()
{
wrapper<2, 3> x;
return 0;
}
提前知道所有模板参数base
are int
, I use template <int...T>
在声明中wrapper
。这允许有限的灵活性,例如我可以为模板参数定义一些默认值base
,不修改wrapper
.
然而,如果base
取决于类型和非类型模板参数的任意列表,我如何传递模板参数wrapper
to base
?
例如,如果我知道的所有模板参数base
可以隐式转换为 int (没有损失!),我可以定义wrapper
如下面的程序所示
#include <iostream>
template <int i, bool j>
struct base {
base()
{
std::cout << "i is " << i;
std::cout << " j is " << (j ? "true" : "false") << std::endl;
}
};
template <int... T>
struct wrapper {
base<T...> a;
};
int main()
{
wrapper<2, true> x;
return 0;
}
But if base
同时取决于类型和非类型模板参数,如下面的程序所示,显然不可能简单地传递模板参数wrapper
to base
:
#include <iostream>
template <class U, int i, int j>
struct base {
base()
{
std::cout << "i is " << i;
std::cout << " j is " << j << std::endl;
}
};
template <class... T>
struct wrapper {
base<T...> a;
};
int main()
{
wrapper<int, 2, 3> x; // Error!
return 0;
}
该程序无法编译,因为编译器需要以下类型wrapper
.
有没有办法写一个类wrapper
将其模板参数“传递”给类型的成员base
, 不管他们是什么?
这个想法是有一个通用代码wrapper
如果,例如,模板签名base
变化。