请看下面的代码。在捕获lambda表达式的情况下,它将工作并编译得很好。使用绑定调用表达我会得到一个超载表达表达错误从绑定与lambda函数获取运算符()的类型
main.cpp:13:60: error: decltype cannot resolve address of overloaded function
using FuncType = decltype(&std::decay<T>::type::operator());
我如何代码绑定功能,这使得我得到了运营商的类型()方法时,虽然?绑定类型是std::_Bind<void (*(std::_Placeholder<2>, std::_Placeholder<1>))(int, int)>
,我也没有完全理解;我知道void(*)(int,int)作为一个指向int,int和返回void的函数的指针。我想我不明白的语法void *(x,y)(int,int);基本上是x,y部分。我假设毕竟模板的东西有一个方法void operator()(int,int)将得到解决bind_f(x,y)将调用,我试图捕获该类型。
#include <iostream>
#include <functional>
#include <type_traits>
void tester(int x, int y) {
std::cout << " x = " << x << " y = " << y << std::endl;
}
template <typename T>
class TypeChecker;
template <typename T>
using FuncType = decltype(&std::decay<T>::type::operator());
int main() {
using namespace std::placeholders;
auto bind_f = std::bind(tester, _2, _1);
bind_f(1,2);
int y = 5;
auto lambda = [y]() {
std::cout << " y = " << y << std::endl;
};
typedef FuncType<decltype(lambda)> x1;
typedef FuncType<decltype(bind_f)> x2;
//TypeChecker<decltype(bind_f)> t2;
}
一个bind表达式有一个模板化的调用操作符[接受任意数量和种类的参数](https://ideone.com/K2nzuT)。一个非多态的lambda拥有一个非模板调用操作符。 –
我可以问一下,你为什么想要首先使用绑定?或者这仅仅是为了教化?我并不是说这个问题不好,不要误解,只是指出实际的答案是“不要使用绑定”,因为它的使用被推荐为不支持lambda(特别是在14中有lambda类型) )。 –
这是有道理的,是的,我创造的东西涵盖了所有的情况,但一般情况下,我想使它不能用于绑定我只是觉得有人可能会要求它与绑定一起工作。我想知道是否有一种方法可以使FuncType这样,它将允许使用FuncType = decltype(T :: operator()(std :: declval)这样的'template ()...))(TS ...); ' –
bjackfly