template<typename T,typename F,typename R = typename std::result_of<F(T)>::type>
R operator>>(T t,F f){
return f(t);
}
int inc(int i){
return i + 1;
}
struct foo{
int i = 0;
};
void print_foo(foo f){
std::cout<< f.i << std::endl;
}
int get_foo_i(foo f){
return f.i;
}
int main()
{
foo f{1};
f >> print_foo;//works
int i = f >> get_foo_i;//works
int i2 = 5 >> inc;//invalid operants
return 0;
}
Я создал свой собственный >>
оператор, который действует как труба. Он работает для моих пользовательских типов, но он разбивается на типы, у которых уже есть оператор >>
.Можно ли переопределить операторов?
Можно ли переопределить оператор >> глобально для всех типов? Может быть, я могу сделать это с помощью пространства имен?
5 pipe::>> inc
* «и нестандартный тип должен быть на левой стороне» * [[править] (http://coliru.stacked-crooked.com/a/b47a2e9ac6767062)] – dyp
Нестандартный тип может быть на любом или обе стороны –
Сторона операторов зависит от того, где была определена перегрузка. Если перегрузка была определена внутри класса, то LHS передается как «это» методу, и RHS может быть неявно преобразован. Если метод перегружен вне класса, то обе стороны могут быть преобразованы. Поэтому, только если метод был объявлен внутри класса, LHS должен быть вашим настраиваемым типом, потому что «это» не может быть неявно преобразован – victor