2014-04-30 5 views
0

다른 사업자와 클래스 메소드와 동일한 기능 레이아웃을 사용하여 다음과 같은 클래스에서 항상 object2있는 오브젝트 1C++ : 나는 다음과 같은 기능 레이아웃이

bool foo(object1, object2, method_x, op_y, method_z) { 
    if (object1.method_x() op_y object2.method_z()) { 
     do something; 
} 

객체. 그러나 그들의 방법과 그 사이의 연산자는 임의적입니다. 저는 여러분이 연산자를 템플릿 매개 변수로 전달할 수 있다는 것을 알고 있습니다. 그러나 회원 기능은 어떻습니까? 도움이된다면 그들은 아무런 논쟁도하지 않습니다.

+0

달성하려는 목표는 무엇입니까? 나는 XY 문제를 여기에서 감지한다. http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – sehe

+0

나는 약간의 변화를 반복하면서 같은 함수 레이아웃을 반복적으로 쓰고 싶지 않다. – SpaceMonkey

답변

4

입력을 피하려는 경우 MACRO는 일반적인 (악의적 인) 메커니즘입니다.

C++ 1y에서는 비슷한 것을 얻기 위해 다형성 람다를 사용할 수 있습니다.

foo(object1, object2, 
     [](auto o) { return o.method_x(); }, 
     [](auto a, auto b) { return a == b }, 
     [](auto o) { return o.method_z() }); 
방법은 단지입니다만큼 물론

, 당신은

foo(object1, object2, 
     std::memfn(&Object1::method_x), 
     [](auto a, auto b) { return a == b }, 
     std::memfn(&Object2::method_z)); 

업데이트 수 : 당신은 종류가 제한 될 수 있음을 추가하기 때문에, 적절한 유형의 모든 auto을 대체 할 수 어쩌면

template <typename T, typename Mx, typename Op, typename Mz> 
bool foo(T& object1, T& object2, Mx method_x, Op op_y, Mz method_z) { 
    if (op_y(method_x(object1), method_z(object2)) { 
     // do something; 
} 
+0

여기에 매크로를 사용하지 않는 이유는 없습니다. 모든 컴파일러가 lambdas (광산은 지원하지 않습니다)를 지원하는 것은 아니며, 거의 모든 것이 수행 될 때까지는 일반 유형 및 방법을 고수 할 것을 제안합니다. – phyrrus9

+0

감사합니다. 내 프로젝트에서 C++ 11을 사용할 수는 없지만 첫 번째 해결책을 다른 곳에서 시도해 보겠습니다 : D. – SpaceMonkey

+0

@ phyrrus9 람다가 필요하지 않습니다. 'std :: less ','std :: greater_equal '등등을 사용할 수도 있습니다. – sehe

관련 문제