gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:29:37 26 4
gpt4 key购买 nike

是否可能有一个结构可能有也可能没有成员?像这样:

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

不幸的是,这需要您重复输入所有公共(public)成员(在本例中仅为 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]]属性基本上也为成员提供了空基类优化。

关于c++ - 可能有也可能没有成员的模板结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53290463/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com