基于用户提供的模板参数启用某些模板参数

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

考虑以下类模板:

template<class T, std::size_t S, SomeEnum = SomeEnum::NOT_DYNAMIC>
class Foo {

在某些地方将被定义为

class SomeEnum { NOT_DYNAMIC, DYNAMIC };

该类有一个私有的

std::array
,但是基于用户传递给Somenum的值,我想使用
std::vector
。例如,如果用户通过
SomeEnum::DYNAMIC
,我将使用
std::vector
而不是
std::array
。这将通过
std::conditional_t
[[no_unique_address]]
。 我想知道是否有一种方法可以“删除”非类型模板参数

S

,以防用户传递

SomeEnum::DYNAMIC
。这是为了避免使用用户类型A大小,因为不必要,因为底层的contaier为
std::vector
。同时,我需要保留
S
参数,以防用户不将任何内容传递给
SomeEnum
,因为
std::array
也需要大小。
有一些骗局,如果没有,我该如何解决?
current的思想:

用STD :: conditdatal_t解释,

使用继承或使用专业化(尚未尝试或想到)
  • 肺化不是一个选择
  • 标准库中存在类似的情况,存在
  • std::span<T, N>
c++ templates template-meta-programming
1个回答
5
投票
:省略模板参数完全默认为

std::dynamic_extent
(std::size_t) -1),您可以使用它具有
std::vector
a
std::array
template<class T, std::size_t S = std::dynamic_extent>
class Foo {
private:
    std::conditional_t<(S == std::dynamic_extent), std::vector<T>, std::array<T, S>> container;
};
	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.