假设我想为pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -g r.c
pi@raspberrypi:/tmp $ cat i
// Parameters: a, the first integer; b the second integer.
// Returns: the sum.
int add(int a, int b)
{
return a + b/c; // An inline comment.
}
int sample = sample;
pi@raspberrypi:/tmp $ ./a.out i o
pi@raspberrypi:/tmp $ cat o
int add(int a, int b)
{
return a + b/c;
}
int sample = sample;
和所有容器重载左移位运算符。
这是我目前拥有的(用ostream
编译):
-fconcepts
但是,问题在于,#include <vector>
#include <iostream>
template<typename Container>
concept bool Iterable = requires(Container t) {
{ *t.begin()++, t.end() };
};
template<Iterable T>
std::ostream& operator<<(std::ostream& out, const T& t) {
for(const auto& it: t) {
out << it << " " ;
}
return out;
}
int main() {
std::vector<int> a = {1, 2, 3};
std::cout << a << std::endl;
std::string str = "something";
// std::cout << str << std::endl; // compile error if the template is defined
return 0;
}
的{{1}}版本已经存在。
是否存在排除某个概念中某些内容的通用(类似于ostream&<<
表达式)或特定(也许类似于我可以排除具体类的局部专业化)方式?
如果没有,解决此问题的正确方法是什么?
答案 0 :(得分:2)
template<Iterable T>
requires !requires(std::ostream o, T a) { operator<<(o, a); }
std::ostream& operator<<(std::ostream& out, const T& t) {
for(const auto& it: t) {
out << it << " " ;
}
return out;
}
添加一个要求,该类型尚未定义operator<<
。我不是100%确信这应该起作用,但是确实可以在gcc上起作用。
(仅o << a
导致gcc崩溃)