【问题标题】:How to set-up nest template parameters?如何设置嵌套模板参数?
【发布时间】:2019-06-13 18:59:38
【问题描述】:

我目前正在开发一个带有模板类的 C++ 项目。我以前做过,而且我知道模板对单级模板参数的工作原理。但是对于我当前项目中的课程,我使用以下内容(重要说明:为阅读目的而进行了高度简化)

template<typename T>
struct B{
    B(){}
    void bar();
};

template<int k>
struct A{
    A(){}
    void foo(); 
};

template class A<1>;
template class B< A<1> >;

只要我不调用 foo() 或 bar(),它就可以正常编译和运行。现在,我知道如何使用 void foo() 为所有 k 编写模板

template<int k>
void A<k>::foo(){
    printf("foo %d\n", k);
}

我知道我可以放

template<>
void B<A<1> >::bar(){
    printf("A<1> bar\n");
}

这将为 B > 实现 bar()。事情是这样的:我想为 k 使用多个值(k=1 只是一个例子),而不必为所有情况复制上述内容。这就是为什么我也想为 bar() 编写一个模板。然而,

template<int k>
void B<A<k> >::bar(){
    printf("Templated bar() for k=%d\n", k);
}

不起作用。对于任何 B ,模板 bar() 的确切模板语句必须是什么?在这种情况下,A 类和 B 类是在我不允许更改的库(标题)中交付的,并且 foo() 和 bar() 有待实现。

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    您可以像这样对B 进行部分专业化:

    // this is unchanged
    template<typename T>
    struct B{
        B(){}
        void bar();
    };
    
    // but this is added by you
    template <int k>
    struct B<A<k>> {
        void bar();
    };
    

    这将使您能够实施:

    template <int k>
    void B<A<k>>::bar() {
        printf("A<k> bar\n");
    }
    

    然后运行:

    int main() {
        B<A<3>> b{};
    
        b.bar();
    }
    

    【讨论】:

    • 值得一提的进一步概括:template&lt;template &lt;int&gt; class T, int k &gt; struct B&lt; T&lt;k&gt; &gt;{void bar(){printf("bar %d\n", k);}};
    【解决方案2】:

    部分特化很好(正如其他人所提到的),但您必须实现原始类B 中的所有成员。另一种方法是使用外部工具(本例中为A_traits)从A 中提取k

    template <typename>
    struct A_traits;
    
    template <int K>
    struct A_traits<A<K>> : std::integral_constant<int, K> {};
    

    您的实现几乎没有变化,只需使用A_traits 提取k

    template <typename T>
    void B<T>::bar() {
      printf("Templated bar() for k=%d\n", A_traits<T>::value);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-01
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-01
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多