可能没有成员的模板结构

时间:2018-11-13 22:27:37

标签: c++ templates struct

是否有可能具有成员的结构?像这样:

template <typename T, typename A = some_type_with_size_0>
struct s {
    T t;
    A aux;
};

具体来说,如果我要求s<int, int>,我将得到带有两个int的结构,但是如果我要求s<int>,我将得到仅具有{{ 1}}。

2 个答案:

答案 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;
};