我有以下“主要”模板:
template <
template <typename> class S
> struct TT { /*...*/ };
以及我想与TT
一起使用的模板:
template <int N, typename T> struct S1 {};
特别是,我想使用像
这样的东西TT< S1<5> > t2; // "Invalid template arguments" here
它是模板的一种部分应用。我知道Boost.MPL涉及这种东西。问题是我已经有一些代码使用TT和模板,如
template <typename T> struct S2 {}; // S3, S4…
喂给TT。
所以问题是:我如何使用S1
TT
对现有代码进行最小修改。如果必须使用Boost.MPL,请告诉我最合适的解决方案。
答案 0 :(得分:8)
将从S1
派生的类模板定义为:
template <typename T>
struct S11 : S1<5,T>
{
};
然后使用S11
代替S1
:
TT< S11> t2; //it is as if TT< S1<5> > t2
阅读你的评论,似乎你需要这个:
template<int N>
struct Magic
{
template <typename T>
struct S11 : S1<N,T>
{
};
};
//Usage
TT<Magic<5>::S11> t2;
答案 1 :(得分:3)
您还可以编写通用的部分应用程序工具:
template <template <typename ...> class TT, typename... Args>
struct Apply
{
template <typename... Rest>
struct T : TT < Args..., Rest... >
{
};
};
或者像这样,如果你希望应用程序的结果时间是原始模板的特化而不是派生类(派生类等):
template <template <typename ...> class TT, typename... Args>
struct Apply
{
template <typename... Rest>
struct _T
{
typedef TT < Args..., Rest... > type;
};
template <typename... Rest>
using T = typename _T < Rest... >::type ;
};