如何为模板类型创建别名?
How to create alias for template type?
我有一些模板 classes,其声明如下所示:
template <typename T, typename A, typename B, typename C>
class foo1;
template <typename T, typename A, typename B, typename C>
class foo2;
...
我在以下上下文中使用它们(每个 foo*
都用 A
和 B
和 C
实例化,其中 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;
};
为了简单明了,我希望能够省略 bar
中的 A
、B
和 C
参数,只写:
...
foo1<int> f1;
...
我知道我可以像这样对所有 foo
类型使用别名模板:
template <typename T>
using foo1_a = foo1<T, A, B, C>;
但是 foo
类型可能有很多,需要为所有类型创建别名。
我试图将所有这些别名放在 class:
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;
?
如果 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;
};
我有一些模板 classes,其声明如下所示:
template <typename T, typename A, typename B, typename C>
class foo1;
template <typename T, typename A, typename B, typename C>
class foo2;
...
我在以下上下文中使用它们(每个 foo*
都用 A
和 B
和 C
实例化,其中 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;
};
为了简单明了,我希望能够省略 bar
中的 A
、B
和 C
参数,只写:
...
foo1<int> f1;
...
我知道我可以像这样对所有 foo
类型使用别名模板:
template <typename T>
using foo1_a = foo1<T, A, B, C>;
但是 foo
类型可能有很多,需要为所有类型创建别名。
我试图将所有这些别名放在 class:
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;
?
如果 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;
};