可能有也可能没有成员的模板结构

问题描述 投票:0回答:2

是否有可能有或可能没有成员的结构?像这样的东西:

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

具体来说,如果我要求s<int, int>,我会得到一个带有两个ints的结构,但如果我要求s<int>,我会得到一个只有int的结构。

c++ templates struct
2个回答
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]]属性基本上也为成员提供了空基类优化。


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;
};
© www.soinside.com 2019 - 2024. All rights reserved.