【发布时间】:2020-07-09 20:40:19
【问题描述】:
我试图了解如何声明一个需要为给定类型重载特定运算符的概念。假设我有以下函数,它接受任意类型的向量并将其打印到std::cout:
template<typename printable>
void print_vector(const std::vector<printable>& vec)
{
std::cout << '{';
for (const printable &item : vec) {
std::cout << item << ',';
}
std::cout << '}';
}
如果printable 类型有一个重载的<< 运算符,这段代码就可以正常工作,但如果没有,那么它就会失败并出现一个非常无用的编译器错误。我觉得我应该能够以某种方式声明一个需要定义有效<< 运算符的类型的概念,并在函数声明中使用该概念,这样我可以获得更有用的编译器错误,但我没有能够弄清楚如何做到这一点。
【问题讨论】:
-
您可以在模板函数中使用
static_assert来检查您的条件(例如 -
@AdrianMaire 根据经验,即使
static_assert失败,编译器也经常会吐出 no match for operatorstatic_assert 可能会产生意想不到的后果(与 SFINAE 或概念相反)。例如,如果 ADL 可以找到另一个print_vector。
标签: c++ c++20 c++-concepts