c++ 基于用户提供的模板参数启用特定模板参数

2izufjch  于 2022-12-01  发布在  其他
关注(0)|答案(1)|浏览(195)

请考虑下列类别样板:

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,
  • 使用继承或使用专门化(尚未尝试或想到)
  • 多态性不是一个选项
pw9qyyiw

pw9qyyiw1#

std::span<T, N>std::span<T>在标准库中也存在类似的情况:完全省略template参数会将大小预设为std::dynamic_extent(std::size_t) -1),您可以使用它来拥有std::vector而非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;
};

相关问题