gpt4 book ai didi

c++ - 如何专门化模板类成员结构

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:21:39 24 4
gpt4 key购买 nike

假设我有以下模板类:

template<typename T>
class Foo {
struct store_t {
uint8_t data[];
} store;
/// other stuff using T
}

有没有办法构造一个专门版本的内部结构,相当于这样的东西:

class Foo {
struct store_t {
uint16_t f1;
uint16_t f2;
} store;
/// other stuff using T
}

我宁愿让大部分“使用 T 的其他东西”保持非特化。不过,我会专门研究一些访问器。我觉得我想写一些类似的东西

template<>
struct store_t {
uint16_t f1;
uint16_t f2;
} Foo<someT>::store;

但这当然行不通。

最佳答案

与生活中的大多数事情一样,“如何解决我遇到的模板问题”的答案是“使用更多模板”。

解决方案 1 - 将 store_t 编写为模板

值得庆幸的是,我们不必做任何疯狂的事情。让我们在 Foo 之外编写 store_t 作为模板:

template<bool use_uint8>
struct Foo_store_t {
uint8_t data[];
};
template<>
struct Foo_store_t<false> {
uint16_t f1;
uint16_t f2;
};

现在,在编写 Foo 时,我们可以通过测试一些条件来选择我们想要使用的:

template<class T>
class Foo {
constexpr static bool use_uint8 = /* stuff */;
using store_t = Foo_store_t<use_uint8>;
store_t store;
};

解决方案 2 - 编写两个版本的 store_t,使用 std::conditional

这个也很简单。 std::conditional 允许您使用 bool 值在两种不同(任意)类型之间进行选择。

struct store_A {
uint8_t data[];
};
struct store_B {
uint16_t f1;
uint16_t f2;
};
class Foo {
constexpr static bool useVersionA = /* stuff */;
using store_t = std::conditional_t<useVersionA, store_A, store_B>;
};

这里我使用的是 std::conditional_t,它出现在 C++14 中,但如果您仅限于使用 C++11,只需执行以下操作:

class Foo {
constexpr static bool useVersionA = /* stuff */;
using store_t = typename std::conditional<useVersionA, store_A, store_B>::type;
};

关于c++ - 如何专门化模板类成员结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55861378/

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