c ++模板代码解释

时间:2016-06-19 08:48:16

标签: c++ templates lambda

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]

你能解释一下上面的代码吗?非常感谢你!

1 个答案:

答案 0 :(得分:1)

  

为什么function_traints会从自身继承?

它没有。 Functiondecltype(&Function::operator())是不同的类型,因此function_traits<Function>和`function_traits也是不同且不相关的类型。

  

第二类只做typedef类型吗?

是。对于特质类来说这是正常的。在这种情况下,function_traits提供对可调用对象的返回类型的无限制访问,无论该对象是什么:函数指针,指向成员的指针,lambda或其他任何东西。

  

func是std :: function指针,这个转换好吗?

不,转换不正常。它至少有三个问题:

  1. 您不能将任何lambda转换为函数指针,只能转换非捕获lambdas。
  2. 存在内存泄漏(动态分配完全没必要)。
  3. 函数指针通常与void*不兼容,void*size_t不兼容。此代码可能适用于某些平台,但不适用于其他平台。