缩小C ++概念以排除某些类型

时间:2019-02-27 18:25:09

标签: c++ templates template-meta-programming c++-concepts

假设我想为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&<<表达式)或特定(也许类似于我可以排除具体类的局部专业化)方式?

如果没有,解决此问题的正确方法是什么?

1 个答案:

答案 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崩溃)