gpt4 book ai didi

c++ - 使用全局 std::array 引用作为模板参数时如何简化参数?

转载 作者:行者123 更新时间:2023-12-02 03:39:12 25 4
gpt4 key购买 nike

这适用于 C++17:

template <std::size_t N, const std::array<int, N> & ARRAY> class Foo {};

constexpr std::array<int, 3> A{1, 2, 3};

void bar()
{
Foo<3, A> foo_a;
}

那么有没有办法避免在 Foo 的模板参数中写入 N 呢?因为我们可以很容易地从ARRAY.size()知道它。我尝试了这个但失败了:

template <template <size_t N> const std::array<int, N> & ARRAY> Foo {}; // Error.

最佳答案

您无需指定引用的确切类型。您可以使用占位符:

#include<array>

template <auto& ARRAY> class Foo {
static constexpr auto N = ARRAY.size();
};

constexpr std::array<int, 3> A{1, 2, 3};

void bar()
{
Foo<A> foo_a;
}

如果您想在模板参数不是对 std::array<int, ...> 的引用时出现错误,您可以编写一个类型特征,告诉您该类型是否是 std::array 的实例化并检查 value_type :

#include<array>
#include<type_traits>

template<typename>
struct is_std_array : std::false_type {};

template<typename T, std::size_t N>
struct is_std_array<std::array<T, N>> : std::true_type {};

template<typename T>
inline constexpr auto is_std_array_v = is_std_array<T>::value;

// std::remove_cvref_t will be part of C++20
template<typename T>
using remove_cvref_t = std::remove_cv_t<std::remove_reference_t<T>>;

template<auto& ARRAY>
class Foo {
using ARRAY_type = remove_cvref_t<decltype(ARRAY)>;

static_assert(is_std_array_v<ARRAY_type>,
"Foo requires reference to std::array of int as template argument!");
static_assert(std::is_same_v<typename ARRAY_type::value_type, int>,
"Foo requires reference to std::array of int as template argument!");

constexpr static auto N = ARRAY.size();
};

constexpr std::array<int, 3> A{1, 2, 3};
constexpr std::array<long, 3> B{1, 2, 3};
constexpr int C = 5;

void bar()
{
Foo<A> foo_a;
// Foo<B> foo_b; // Will give static_assert error message
// Foo<C> foo_c; // Will give static_assert error message
}

在 C++20 中会有概念,这将允许您编写一个概念来测试我现在正在使用 static_assert 测试的属性。 s,您将能够使用该概念代替 auto在模板参数中。

关于c++ - 使用全局 std::array 引用作为模板参数时如何简化参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59435806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com