2014-03-31 37 views
2

我有一个函数:检查的std ::功能的std ::加或std ::减去

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

应该返回true如果funcstd::plusstd::minus实例,但我不知道如何去检查。我不能使用dynamic_cast,因为它不是指针。

+0

检查'target_type'? http://en.cppreference.com/w/cpp/utility/functional/function/target_type –

+0

算术有* e *。 – Potatoswatter

+0

Lol编辑@Patatoswatter – Tips48

回答

5

可以使用target()成员:

#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)); 
} 

测试的类型是直线前进。测试特定的对象似乎并不那么简单:尽管原始问题不是必需的,但代码还显示了如何测试函数指针的特定对象。

+0

完美!谢谢 – Tips48

2

std::function有2个方便的成员设计用于此特定任务:std::function::target_typestd::function::target

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

+0

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

+0

@ Tips48:'target()'成员是一个函数,即你需要调用它。它返回一个适当类型的指针或null(参见文档)。由于'std :: plus '和'std :: minus '是类型,您可以使用它们来测试目标类型是否匹配。 –