介绍
我想使用概念和/或类型特征来检测类是否具有带有 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 OStreamRealizationBad
{
uint8_t send(std::array<uint8_t, 0> array)
};
Question
有没有办法写这个来确保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>;
};
附加问题
另外,我不明白为什么上面的例子不起作用。