0

假设我有这个代码:

// header file

template < std::unsigned_integral size_type = uint32_t >
class Foo
{
public:
    inline static constexpr size_type max { 168 };
};


// source file

// definitions of class's function templates


// call site

template class Foo<uint8_t>;

正如你所看到的,我正在寻找一种方法让用户(即编码器)max在实例化Foo. 例如255( 的最大值uint8_t)等。也许像这样:

template class Foo<uint8_t, 255>;

这怎么可能?我也看过变量模板,但我不知道如何让它以一种可读和优雅的方式工作。

还有一种方法可以将静态成员变量与类定义分开并将其移动到源文件中吗?因为我试图处理的这个变量与类的实现有关,而不是它的接口。我有 4 个这样的变量,所以我不知道如何让它工作,同时保持代码的可读性。

4

1 回答 1

3

你的目标不明确。你想要这样的,具有默认值的非类型模板参数吗?

#include <concepts>
#include <cstdint>
#include <limits>

template <std::unsigned_integral size_type = uint32_t,
          size_type m = std::numeric_limits<size_type>::max()>
class Foo {
 public:
  inline static constexpr size_type max { m };
};

Foo f0;
Foo<uint8_t> f1;
Foo<uint8_t, 127> f2;
static_assert(Foo<uint8_t>::max == Foo<uint8_t, 255>::max);
于 2022-02-17T21:20:47.130 回答