关键字使用是否可以用于部分专业化?

时间:2017-06-22 12:08:52

标签: c++11 templates

假设:

template <class T, class P>
struct A;

template <class P> 
struct B {};

我可以写:

template <class P>
struct A<int,P> : B<P> {};

但由于我必须重新定义构造函数,因此这很乏味。有没有办法写类似的东西:

template <class P>
using A<int,P> = B<P>;

1 个答案:

答案 0 :(得分:0)

这是你应该做的:

template <class T, class P> struct A_impl;

template <class P> struct A_impl<int,P>
{
    using type = B<P>;
};

template <class T, class P> using A = typename A_impl<T,P>::type;

// Now `A<int,P>` is an alias for `B<P>`.

代码使用C ++ 11中的type alias template

作为替代方案,您可以使用B<P>将所有构造函数从A<int,P>导入using

对我来说看起来不太理想,但仍然可以使用。

#include <iostream>

template <class T, class P> struct A;

template <class P> struct B
{
    B(int) {std::cout << "B(int)\n";}
};

template <class P> struct A<int,P> : B<P>
{
    using B<P>::B; // <--
};

int main()
{
    A<int, void> a(42); // Prints `B(int)`.
}