2014-03-31 3 views
2

경우 나는 기능이 있습니다 std::plus 또는 std::minus의 인스턴스 truefunc 경우확인 표준 : : 함수가 표준 : 플러스 표준 : 마이너스

bool basicArithmetic(std::function<int(int, int)> func) { 
} 

그것은 반환해야을하지만 난 아무 생각하는 방법이 없습니다 확인하다. 포인터가 아니기 때문에 dynamic_cast을 사용할 수 없습니다.

+0

'target_type'을 확인 하시겠습니까? http://en.cppreference.com/w/cpp/utility/functional/function/target_type –

+0

산술 연산에 * e *가 있습니다. – Potatoswatter

+0

롤 편집 됨 @ Potatoswatter – Tips48

답변

5

당신은 target() 멤버를 사용할 수 있습니다. 특정 객체에 대한 테스팅은 그렇게 간단한 것처럼 보이지 않습니다. 원래의 질문에는 필요하지 않지만 코드는 함수 포인터의 특정 객체를 테스트하는 방법도 보여줍니다.

+0

완벽한! 고맙습니다 – Tips48

2

std::function에는 std::function::target_typestd::function::target과 같이이 특정 작업을 위해 설계된 2 개의 편리한 멤버가 있습니다. 유형

#include <functional> 
#include <iostream> 

int f(int, int) { return 0; } 
int g(int, int) { return 0; } 

void test(std::function<int(int, int)> const& arg) 
{ 
    std::cout << "test function:\n"; 
    if (arg.target<std::plus<int>>()) { 
     std::cout << "it is plus\n"; 
    } 
    if (arg.target<std::minus<int>>()) { 
     std::cout << "it is minus\n"; 
    } 

    int (*const* ptr)(int, int) = arg.target<int(*)(int, int)>(); 
    if (ptr && *ptr == f) { 
     std::cout << "it is the function f\n"; 
    } 
    if (ptr && *ptr == g) { 
     std::cout << "it is the function g\n"; 
    } 
} 

int main() 
{ 
    test(std::function<int(int, int)>(std::plus<int>())); 
    test(std::function<int(int, int)>(std::minus<int>())); 
    test(std::function<int(int, int)>(f)); 
    test(std::function<int(int, int)>(g)); 
} 

테스트 정직 :

http://en.cppreference.com/w/cpp/utility/functional/function

+0

'return func.target == std :: plus () || func.target == std :: minus ();'? – Tips48

+0

@ Tips48 :'target()'멤버는 함수입니다. 즉, 호출해야합니다. 적절한 유형 또는 널 포인터를 리턴합니다 (문서 참조). 'std :: plus '와'std :: minus '이 타입이기 때문에, 이것들을 사용하여 타겟 타입이 일치하는지 테스트 할 수 있습니다. –