是否有可能有或可能没有成员的结构?像这样的东西:
template <typename T, typename A = some_type_with_size_0>
struct s {
T t;
A aux;
};
具体来说,如果我要求s<int, int>
,我会得到一个带有两个int
s的结构,但如果我要求s<int>
,我会得到一个只有int
的结构。
在C ++ 20中,可以直接执行您要执行的操作:
template <typename T, typename A = some_type_with_size_0>
struct s {
T t;
[[no_unique_address]] A aux;
};
见https://en.cppreference.com/w/cpp/language/attributes/no_unique_address。
在C ++ 17中,没有直接的方法来指定有条件地消失的成员。您需要编写一个完整的部分特化,如下所示:
template <typename T, typename A = void>
struct s {
T t;
A aux;
};
template <typename T>
struct s<T, void> {
T t;
};
不幸的是,这需要你重复自己输入所有普通成员(在这种情况下只有t
)。为避免这种情况,我们可以将有条件存在的成员粘贴到基类中:
template <typename T, typename A = void>
struct s : optional_aux<A> {
T t;
};
template <typename A>
struct optional_aux {
A aux;
};
template <>
struct optional_aux<void> { };
在A = void
的情况下,这个基类是空的,因此编译器可以自行删除它,使sizeof(s<T, void>)
可能等于sizeof(T)
。 [[no_unique_address]]
属性基本上也为成员提供了空基类优化。
您可以使用可变参数模板:
template <typename...> struct Generic;
template <typename T1> struct Generic<T1> {
T1 field1;
};
template <typename T1, typename T2> struct Generic<T1, T2> {
T1 field1;
T2 field2;
};