【问题标题】:Template specialization on typename parameter being any instantiation of a particular templatetypename 参数的模板特化是特定模板的任何实例化
【发布时间】:2012-06-13 05:00:30
【问题描述】:

我有一个类模板Z,当传递一个特定模板N 的任何实例化类型时,我想对其进行专门化:

struct L {
    template <typename S> void foo(S &) {/*...*/}
};

template <class T>
struct M {
    template <typename S> void foo(S &) {/*...*/}
};

template <class T>
struct N {
    template <typename S> void foo(S &) {/*...*/}
};

// I'd like to specialize this for TY==N<anything>
template <typename TX, typename TY>
struct Z {
    void bar(TX &tx) { /*...*/ ty->foo(tx); /*...*/ }
    TY *ty;
};

由于Z&lt;int, L&gt;Z&lt;int, N&lt;int&gt;&gt;Z&lt;int, M&lt;int&gt;&gt; 都是有效的用例,我无法将Z 转换为模板模板,并且@ 可以显着降低复杂性987654328@ 当TY 是从N 构建的类时。有没有办法做到这一点?

【问题讨论】:

    标签: c++ templates template-specialization boost-mpl template-templates


    【解决方案1】:

    这应该会影响你想要的专业化:

    template <typename TX, typename ANY>
    struct Z< TX, N<ANY> > {
        // ...
    };
    

    Z 在第一个参数是TX,第二个参数是N&lt;ANY&gt; 时被特化。一个简单的例子:

    template <typename A> struct N { A a; };
    
    template <typename TX, typename TY>
    struct Z { Z () { std::cout << "not special" << std::endl; } };
    
    template <typename TX, typename ANY>
    struct Z< TX, N<ANY> > { Z () { std::cout << "special" << std::endl; } };
    
    int main ()
    {
        Z<int, int> z1;
        Z<int, N<int> > z2;
    }
    

    输出结果:

    not special
    special
    

    【讨论】:

    • 谢谢,这正是我想要的。我曾摆弄过签名,但无法推断出正确的签名。我想我现在实际上总体上更好地了解了模板的参数语法。
    • 很高兴能提供帮助。对我提出的问题 +1。
    猜你喜欢
    • 2011-05-10
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多