如何为模板类型创建别名?

时间:2018-11-28 10:09:25

标签: c++ c++11 templates template-meta-programming template-aliases

我有一些模板类,其声明如下:

template <typename T, typename A, typename B, typename C>
class foo1;

template <typename T, typename A, typename B, typename C>
class foo2;

...

我在以下上下文中使用它们(每个foo*A实例化的BC被实例化的bar)  :

template <typename A, typename B, typename C>
class bar {
    foo1<int, A, B, C> f1;
    foo2<int, A, B, C> f2;
    foo2<char, A, B, C> f3;
};

出于简单和清晰的原因,我希望能够省略A中的BCbar参数,而只需编写:

...
foo1<int> f1;
...

我知道我可以为所有foo类型使用别名模板:

template <typename T>
using foo1_a = foo1<T, A, B, C>;

但是foo类型可能有很多,并且需要为所有这些类型创建别名。

我试图将所有这些别名放在一个类中:

template <typename A, typename B, typename C>
class types {
    template <typename T>
    using foo1_a = foo1<T, A, B, C>;

    ...
};

然后用法如下:

...
using t = types<A,B,C>;
typename t::template foo1_a<int> f1;
...

但是我认为这看起来更糟...

是否可以通过其他方式实现这一目标?

2 个答案:

答案 0 :(得分:7)

template <template <typename...> class Cnt, typename T>
using bar = Cnt<T, A, B, C>;

使用

bar<foo1, int> f1;
bar<foo2, int> f2;
bar<foo2, char> f3;

答案 1 :(得分:2)

如果仅将A B C提供给bar并转发给fooN参数,则可能需要打包它们。这样,如果fooN签名发生更改,则无需更新条形码。

template <typename… x_FooParams>
class bar {
    foo1<int, x_FooParams...> f1;
    foo2<int, x_FooParams...> f2;
    foo2<char, x_FooParams...> f3;
};