请考虑下列类别样板:
template<class T, std::size_t S, SomeEnum = SomeEnum::NOT_DYNAMIC>
class Foo {
其中SomeEnum将定义为
class SomeEnum { NOT_DYNAMIC, DYNAMIC };
这个类有一个私有的std::array
,但是基于用户传递给SomeEnum的值,我想使用std::vector
。例如,如果用户传递SomeEnum::DYNAMIC
,我将使用std::vector
而不是std::array
。这将通过std::conditional_t
和[[no_unique_address]]
来实现。
我想知道如果用户传递了SomeEnum::DYNAMIC
,是否有一种方法可以“删除”非类型模板参数S
。这是为了避免让用户输入一个大小,因为底层容器是std::vector
。同时,我需要保留S
参数,以防用户不向SomeEnum
传递任何内容。因为std::array
也需要该大小。
有没有可能用一些诡计,如果没有,我怎么解决这个问题?
当前想法:
- 使用如上所述的std::conditional_t,
- 使用继承或使用专门化(尚未尝试或想到)
- 多态性不是一个选项
1条答案
按热度按时间pw9qyyiw1#
std::span<T, N>
或std::span<T>
在标准库中也存在类似的情况:完全省略template参数会将大小预设为std::dynamic_extent
((std::size_t) -1
),您可以使用它来拥有std::vector
而非std::array
: