多参数模板的部分默认特化

时间:2013-11-11 23:39:52

标签: c++ templates template-templates

有没有办法从编译器中提取部分默认特化?

假设我有这两个参数模板:

template<typename A, typename B>
struct X {
    A a;
    B b;
};

我还有一些使用单个参数模板的代码,如下所示:

template<template<typename> class T, typename B>
struct make_T_of_B {
    T<B> member;
};

我希望能够说:

make_T_of_B<X<int>, double> dummy;

其中X&lt; int&gt;被视为单个参数模板。它等同于这个模板:

template<typename B>
struct Y {
    int a;
    B b;
};

看起来像是如何专门化X&lt; int,B&gt;没有改变任何东西。它的方式类似于默认的特化 - 除了默认的特化不会产生另一个模板,而是一个实际的类型(换句话说,它总是全部)。

我意识到我可以级联模板参数

template<typename A>
struct Z1 {
    // start from scratch
    template<typename B>
    struct Z2 {
        A a;
        B b;
    };

    // inherit from double template above
    template<typename B>
    struct X: ::X<A, B> {}; 
};


make_T_of_B<Z1<int>::Z2, double> dummy1;
make_T_of_B<Z1<int>::X, double> dummy2;

但我觉得这很难阅读,也没有清楚地表达我的意图。

谢谢。

2 个答案:

答案 0 :(得分:2)

我误解了你的问题。你想要的只是一种绑定第一个模板参数的方法,你可以很容易地做到这一点:

template <typename T> using Foo = X<int, T>;

现在Foo<double>X<int, double>相同。

如果没有C ++ 11风格的别名,您可以通过更多样板来实现相同的目标:

template <typename T> struct Foo
{
    typedef X<int, T> type;
};

现在使用Foo<double>::type

答案 1 :(得分:0)

我会使用一个特性:

template <typename> struct applicator;

template <template <typename> class Tmpl, typename T>
struct applicator<Tmpl<T>>
{
    template <typename A>
    using rebind = make_T_of_B<Tmpl, A>;
};

现在你可以说:

applicator<X<int>>::rebind<double> dummy;

您当然也可以将第二个参数A移动到主模板中:

template <typename, typename> bpplicator;

template <template <typename> class Tmpl, typename T, typename A>
struct bpplicator<Tmpl<T>, A>
{
    using type = make_T_of_B<Tmpl, A>;  // or "typedef make_T_of_B<Tmpl, A> type;"
};

bpplicator<X<int>, double>::type dummy;

这样做的好处是它也适用于C ++ 03。