根据用户提供的模板参数启用某些模板参数

Som*_*ion 4 c++ templates tmp

考虑以下类模板:

template<class T, std::size_t S, SomeEnum = SomeEnum::NOT_DYNAMIC>
class Foo {
Run Code Online (Sandbox Code Playgroud)

其中 SomeEnum 定义为

class SomeEnum { NOT_DYNAMIC, DYNAMIC };
Run Code Online (Sandbox Code Playgroud)

这个类有一个 private std::array,但根据用户传递给 SomeEnum 的值,我想改用std::vector. 例如,如果用户通过SomeEnum::DYNAMIC,我将使用std::vector代替std::arraystd::conditional_t这将通过和来实现[[no_unique_address]]

我想知道是否有一种方法可以“删除”非类型模板参数S,以防用户通过SomeEnum::DYNAMIC。这是为了避免用户在不必要时键入大小,因为底层容器是std::vector。同时,我需要保留S参数,以防用户没有将任何内容传递给SomeEnum,因为std::array也需要大小。

是否可以通过一些技巧来实现,如果不能,我将如何解决这个问题?

目前的想法:

  • 按照解释使用 std::conditional_t ,
  • 使用继承,或使用专业化(尚未尝试或考虑)
  • 多态性不是一种选择

Art*_*yer 5

标准库中的std::span<T, N>or存在类似的情况std::span<T>:省略模板参数完全将大小默认为std::dynamic_extent( (std::size_t) -1),您可以使用 astd::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;
};
Run Code Online (Sandbox Code Playgroud)