gpt4 book ai didi

c++ - 如何限制参数类型只允许 std::initializer_list 或 std::array

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:13:43 28 4
gpt4 key购买 nike

我希望只有一个模板函数。所以我想到了……

template<typename Iteratable, size_t N,
typename =
std::enable_if_t<
std::is_same_v<Iteratable, const std::initializer_list<size_t> > ||
std::is_same_v<Iteratable, const std::array<size_t, N > >
>
>
std::ostream& operator << (std::ostream& os, Iteratable& in) {
std::copy(std::begin(in), std::end(in), std::ostream_iterator<size_t>(os, " ") );
return os;
}

似乎是因为 Nstd::array<size_t, N> , 特化失败。

有什么方法可以不为这个用例编写 2 个函数吗?

最佳答案

如果您不想重载的唯一原因是避免重复函数体,您可以转而编写自己的特征。一种这样的方式:

namespace details {
template<class Iterable>
struct writable : std::false_type {};

template<size_t N>
struct writable<std::array<std::size_t, N>> : std::true_type {};

template<>
struct writable<std::initializer_list<size_t>> : std::true_type {};

template<class Iterable>
constexpr bool writable_v = writable<Iterable>::value;
}

template<typename Iteratable,
std::enable_if_t<details::writable_v<std::decay_t<Iteratable>>,
int> = 0
>
std::ostream& operator << (std::ostream& os, Iteratable& in) {
std::copy(std::begin(in), std::end(in), std::ostream_iterator<size_t>(os, " ") );
return os;
}

我还冒昧地将 enable_if 移到了模板参数中。这样就无法通过为两个参数指定类型名称来规避 SFINAE(尽管不可否认,重载运算符不太可能发生这种情况)。

关于它的另一个不错的事实是定制点现在与函数定义本身分离。添加新的可迭代对象只是为 details::writable 添加另一个特化的问题。

Live Example

关于c++ - 如何限制参数类型只允许 std::initializer_list<size_t> 或 std::array<size_t, N>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48061161/

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