c++ - 使用概念或 SFINAE 检查类是否具有带有 std::array 参数的模板化成员函数

标签 c++ arrays metaprogramming typetraits c++-concepts

介绍
我想使用概念和/或类型特征来检测类是否具有带有 std::array 参数的成员函数。
例如:
下面的类将传递这个概念。

class OStreamRealizationGood
{
    template<size_t size>
    uint8_t send(std::array<uint8_t, size> array)
};
到目前为止,我使用了一个概念技巧。诀窍是将大小定义为 0。
所以我的概念是这样的:
template<typename Candidate>
concept OStream = requires(Candidate candidate, std::array<uint8_t, 0> array)
{
    {candidate.send(array)} -> std::same_as<uint8_t>;
};
这个技巧适用于模板化函数,但它并不是我真正需要的。这不是我需要的东西,因为下面的类(class)也会遵守,但我希望它不会。
class OStreamRealizationBad
{
    uint8_t send(std::array<uint8_t, 0> array)
};

有没有办法写这个来确保send(array)是模板函数吗?
我尝试过的事情
我有一个使用 declval(size_t) 的想法如下图所示,但这不适用于原始类型。
template<typename Candidate>
concept OStream = requires(Candidate candidate, std::array<uint8_t, declval(size_t)> array)
{
    {candidate.send(array)} -> std::same_as<uint8_t>;
};
另一个不起作用的想法是递归概念:
template<typename Candidate, size_t size>
concept HasSendImpl = requires(Candidate candidate, std::array<uint8_t, size> array)
{
    {candidate.send(array)} -> std::same_as<uint8_t>;
};

template<typename Candidate>
concept HasSend = requires(size_t size)
{
        requires HasSendImpl<Candidate, size>;
};
补充问题
另外,我不明白为什么上面的例子不起作用。

最佳答案

Is there a way to write this to ensure that send(array) is a templated function?


您可以使用 template约束中的关键字表示 send需要是一个模板函数:
template<typename T, std::size_t size>
concept GoodRealization = requires(T t, std::array<uint8_t, size> array) {
    { t.template send<size>(array) } -> std::same_as<uint8_t>;
};
DEMO .
请注意,这不会拒绝重载发送的带有非模板和模板函数的类型:两者都是重载决议中的可行候选者,非模板重载可能是最佳候选者(考虑到重载决议的常规规则)。

关于c++ - 使用概念或 SFINAE 检查类是否具有带有 std::array 参数的模板化成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65957179/

相关文章:

c++ - 公开库的模板类是否可取?

c++ - 为什么我写一个空的main没有警告?

c++ - 打印对象数组的每个元素时出现问题

c++ - 预处理器是否盲目地替换了定义?

javascript - 将 DOMElement 数组转换为 jQuery 对象

c - 在 C 循环的每次迭代中初始化不同的数组

c++ - 使用 C++11 可变参数模板在编译时快速排序

c++ - boost_assert 一个参数类实现了某个方法

C++-SDL : Limiting framerate issue

c++ - 用 new 定义的数组大小?