是否有可能具有成员的结构?像这样:
template <typename T, typename A = some_type_with_size_0>
struct s {
T t;
A aux;
};
具体来说,如果我要求s<int, int>
,我将得到带有两个int
的结构,但是如果我要求s<int>
,我将得到仅具有{{ 1}}。
答案 0 :(得分:1)
在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]]
属性基本上也可以为成员提供空的基类优化。
答案 1 :(得分:0)
您可以使用可变参数模板:
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;
};