2014-09-17 2 views
2
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

ответ

5

Вы не можете переопределить операторы для встроенных типов данных, только для пользовательских типов. В вашем примере, чтобы передать 5 в foo, вместо этого вам необходимо переопределить оператор <<.

+3

* «и нестандартный тип должен быть на левой стороне» * [[править] (http://coliru.stacked-crooked.com/a/b47a2e9ac6767062)] – dyp

+0

Нестандартный тип может быть на любом или обе стороны –

+0

Сторона операторов зависит от того, где была определена перегрузка. Если перегрузка была определена внутри класса, то LHS передается как «это» методу, и RHS может быть неявно преобразован. Если метод перегружен вне класса, то обе стороны могут быть преобразованы. Поэтому, только если метод был объявлен внутри класса, LHS должен быть вашим настраиваемым типом, потому что «это» не может быть неявно преобразован – victor

Смежные вопросы