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

标签 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* 都是用 ABC 实例化的, 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 , BC里面的参数 bar然后写:

...
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;
...

但在我看来这看起来更糟......

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

最佳答案

关于

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;

?

关于c++ - 如何为模板类型创建别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53516909/

相关文章:

c++ - 我们可以使用 lambda 表达式作为函数参数的默认值吗?

c++ - 基于范围的 for 循环和 std::vector.push_back() 使程序崩溃

c++ - 在编译时使用给定函数初始化普通二维数组

c++ - 输入trait以接收T::value_type(如果存在),否则为T

c++ - 如何从模板别名切换到 typedef?

python - 使用python支持错误编译opencv

c++ - 返回指针、返回值或传入引用,哪个在C++中优雅?

C++:如何使我的程序打开带有可选参数的.exe

c++ - 如果 T 对齐, std::vector<T> 也对齐吗?

c++ - 这种使用模板的类层次结构的函数重载方式安全吗?