
Hi all I have a class tree as the following template<typename T> struct base{ bool operator()(int i)const { return static_cast< const T&>(*this)(i); } }; struct F1:public base<F1>{ bool operator()(int i) const{ return true; } }; struct F2:public base<F2>{ bool operator()(int i) const{ return true; } }; struct F3 :public base<F3>{ std::string junk_; F3(std::string junk):junk_(junk){} bool operator()(int i) const{ std::cout << junk_ << std::endl; return false; } }; ================================================================== I am trying to use proto to derive the following systax Predicate<F1> f1; Predicate<F2> f2; Predicate<F3> f3("hodqhoqw"); cout << ((f1||f2)&&f3)(1) << endl; ================================================================== When proto get to the point of invoking the F3::operator(), the junk_ attribute got sliced away. I thought I am passing everything by constant reference but the exception tells me otherwise. The full sample code is attached, can someone tell me what I have missed? I am testing my code on vc9 and vc10, and I am not using virtual function for performance issue. Ultimately, I want to have the following syntax in the client code F1 f1; F2 f2; F3 f3("hodqhoqw"); cout << ((f1||f2)&&f3)(1) << endl; Thanks