在没有 C++ 实例的情况下获取 unique_ptr 内 std::array 的大小

אנו*_*ימי 5 c++ unique-ptr c++11 stdarray

我有一个类型声明为:

using Buffer = std::unique_ptr<std::array<uint8_t, N>>;
Run Code Online (Sandbox Code Playgroud)

我还有一个模板函数声明为:

template<typename Buffer>
bool temp_func()
{
    // do something
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 Buffer 类型调用 temp_func:

temp_func<Buffer>();
Run Code Online (Sandbox Code Playgroud)

现在,在 temp_func 中,我想获取该类型的大小Buffer,而不创建该类型的实例。

我需要的是类似于std::tuple_size<Buffer>::value除了我不能调用std::tuple_sizeunique_ptr只能直接调用std::array

我只能使用 C++11。我该怎么做?

Bri*_*ian 10

用于std::unique_ptr::element_type访问包含的数组类型,然后std::tuple_size像平常一样应用。

#include <array>
#include <cstddef>
#include <cstdint>
#include <memory>
#include <tuple>

constexpr std::size_t N{10};

using Buffer = std::unique_ptr<std::array<std::uint8_t, N>>;

static_assert(std::tuple_size<Buffer::element_type>::value == N, "error");
Run Code Online (Sandbox Code Playgroud)

在 godbolt 上尝试一下

在 C++17 或更高版本中,您可以替换std::tuple_size<T>::valuestd::tuple_size_v<T>以更加简洁:

#include <array>
#include <cstddef>
#include <cstdint>
#include <memory>
#include <tuple>

constexpr std::size_t N{10};

using Buffer = std::unique_ptr<std::array<std::uint8_t, N>>;

static_assert(std::tuple_size_v<Buffer::element_type> == N);
Run Code Online (Sandbox Code Playgroud)