template <typename Function>
struct function_traits
: public function_traits<decltype(&Function::operator())> {
}; //1 why function_traints inherit from itself?
template <typename ClassType, typename ReturnType, typename... Args>
struct function_traits<ReturnType(ClassType::*)(Args...) const> {
typedef ReturnType (*pointer)(Args...);
typedef std::function<ReturnType(Args...)> function;
}; //2 this class do nothing just typedef type ?
template <typename Function>
typename function_traits<Function>::function
to_function (Function & lambda) {
return static_cast<typename function_traits<Function>::function>(lambda);
}
template <typename Lambda>
size_t getAddress(Lambda lambda) {
auto function = new decltype(to_function(lambda))(to_function(lambda));
//3 func is std::function pointer,this conversion is ok?
void * func = static_cast<void *>(function);
return (size_t)func;
}
int f(int, int) { return 1; }
int g(int, int) { return 2; }
std::function<int(int, int)> lambda1 = [](int a, int b)->int
{
return 1;
};
std::function<int(int, int)> lambda2 = [](int a, int b)->int
{
return 1;
};
void test(std::function<int(int, int)> const& arg,const char* info)
{
std::cout << "test function: ";
std::cout << (void*)getAddress(arg) << " " << info << std::endl;
}
int main()
{
test(lambda1,"lambda1");
test(lambda1,"lambda1");
test(lambda2,"lambda2");
test(lambda2,"lambda2");
test(std::function<int(int, int)>(std::plus<int>()),"plus");
test(std::function<int(int, int)>(std::minus<int>()),"minus");
test(std::function<int(int, int)>(f),"f");
test(std::function<int(int, int)>(g),"g");
}
1为什么function_traints会从自身继承?
我知道这是奇怪的重复模板模式。将function_traints编译为两个不同的类。
2第二类只做typedef类型吗?
是的,只是为了方便
3 func是std :: function指针,这个转换好吗?
[TODO]
4主要功能结果是:
test function: 0x7f9440407f50 lambda1
test function: 0x7f9440407f80 lambda1
test function: 0x7f9440407fb0 lambda2
test function: 0x7f9440407fe0 lambda2
test function: 0x7f9440408010 plus
test function: 0x7f9440408040 minus
test function: 0x7f9440408070 f
test function: 0x7f94404080a0 g
以上这些功能是错误的?我不能用它来检查两个函数是否相等?
[TODO]
你能解释一下上面的代码吗?非常感谢你!
答案 0 :(得分:1)
为什么function_traints会从自身继承?
它没有。 Function
和decltype(&Function::operator())
是不同的类型,因此function_traits<Function>
和`function_traits也是不同且不相关的类型。
第二类只做typedef类型吗?
是。对于特质类来说这是正常的。在这种情况下,function_traits提供对可调用对象的返回类型的无限制访问,无论该对象是什么:函数指针,指向成员的指针,lambda或其他任何东西。
func是std :: function指针,这个转换好吗?
不,转换不正常。它至少有三个问题:
void*
不兼容,void*
与size_t
不兼容。此代码可能适用于某些平台,但不适用于其他平台。