如何将模板化的整数传递给模板类?

问题描述 投票:0回答:3

假设我有这个:

template<int W, int H>
struct A
{
    A()
    {
        std::cout << W << " - " << H << std::endl;
    }
};

我还有另一个需要

A
结构的结构:

template<template<int W, int H> typename A>
struct B
{
    B()
    {
        std::cout << W << " - " << H << std::endl;
    }
};

我的问题是,如何实例化

B
?我应该在什么时候提供
int
的?

int main()
{
    B<A<50, 50>> b; // "A<50, 50>" is not a template class
    return 0;
}

我在

B
结构上的模板到模板声明有什么问题吗?

c++ templates template-meta-programming
3个回答
0
投票

这不是你想的那样。写作时,

template<template<int W, int H> typename A>
struct B

A
与您之前定义的
template<int, int> struct A
无关(类似于局部变量在其范围内隐藏全局变量)。您给出的定义需要一个 template class(例如,
A
,但没有参数),因此
W
H
将在内部不可用。事实上,我们通常不会写这些参数的名称来表示这一点,但这只是一种约定。

如果您想采用具体的

A<W, H>
,那么也许您能做的最好的事情就是专注于此:

template<typename A_>
struct B;

template<int W, int H>
struct B<A<W, H>>
{
    // current body of class B
}

然后你的代码就可以工作了。另一种可能性是为

constexpr
中的
W
H
提供 (
A
) 吸气剂,但即便如此,您也需要在
B
的定义中学习具体课程。


0
投票

另一种方法是将 W 和 H 定义为 A 类中的常量。

template<int W_, int H_>
struct A
{
    static const int W = W_;
    static const int H = H_;
    A()
    {
        std::cout << W << " - " << H << std::endl;
    }
};

template<typename T>
struct B
{
    B()
    {
        std::cout << T::W << " - " << T::H << std::endl;
    }
};

int main()
{
    B<A<50, 50>> b;
    return 0;
}

0
投票

如果你想为任何类型提供两个

int
作为模板参数,你可以做一个特化:

template <class> struct B; // primary template

// specialization for any `T<int, int>`, such as `A<50, 50>`:
template <template <int, int> class T, int W, int H>
struct B<T<W, H>> {
    B() {
        std::cout << W << " - " << H << std::endl; 
    }
};
© www.soinside.com 2019 - 2024. All rights reserved.