C++ 为什么std::bind可以';不是参数包的参数吗?
我想使用参数包,但发现了问题。 一些代码:C++ 为什么std::bind可以';不是参数包的参数吗?,c++,c++11,lambda,functional-programming,stdbind,C++,C++11,Lambda,Functional Programming,Stdbind,我想使用参数包,但发现了问题。 一些代码: template <typename Function, typename... Args> auto f(Function func, Args... args) -> decltype(func(args...)) { auto f11 = std::bind(func, args...); f11(); } void print(const char* string) { std::cout <&
template <typename Function, typename... Args>
auto f(Function func, Args... args) -> decltype(func(args...))
{
auto f11 = std::bind(func, args...);
f11();
}
void print(const char* string)
{
std::cout << string << std::endl;
}
模板
自动f(函数func,Args…Args)->decltype(函数(Args…)
{
auto f11=std::bind(func,args…);
f11();
}
无效打印(常量字符*字符串)
{
我现在对情况有点了解了
此代码可以纠正此问题:
void print(const char* string)
{
std::cout << string << std::endl;
}
int main(int argc, char ** argv)
{
auto lambda = [] (std::function< void ( const char * ) > printParamFunc) {
printParamFunc("hello from lambda!");
};
std::bind(lambda, std::bind(print, std::placeholders::_1))();
}
而且效果很好。然后添加最重要的部分。尝试破译它并阅读它想要说的内容。没有错误,没有人能帮助你。你能在像ideone这样的东西上组合一个链接,然后添加一个链接,这样我们就可以看到结果错误消息吗?如果不使用自动
,而是使用打印函数
键入std::function
。我不知道这是为什么。来自clang的错误消息表明它无法推断绑定表达式的\u结果类型。下面是上面的一个sscce:--我还不知道它为什么不编译,但它在那里!std::bind的某些特定类型。
f([] (std::function<void(const char*)> printParamFunc) {
printParamFunc("hello from print from std::function");
}, printFunction);
template <typename Function, typename... Args>
auto f(Function func, Args... args) -> decltype(func(args...))
{
func(args...);
}
void print(const char* string)
{
std::cout << string << std::endl;
}
int main(int argc, char ** argv)
{
auto lambda = [] (std::function< void ( const char * ) > printParamFunc) {
printParamFunc("hello from lambda!");
};
std::bind(lambda, std::bind(print, std::placeholders::_1))();
}
template <class F>
struct lazy_evaluate {
typedef typename F::result_type T;
explicit lazy_evaluate(F f) : f_(f) {}
template <class... Args>
T operator()(Args&&... args)
{
f_(std::forward<Args>(args)...);
}
private:
F f_;
};
template <class F>
lazy_evaluate<F> lazy(F f)
{
return lazy_evaluate<F>(f);
}
std::bind(lambda, lazy(std::bind(print, std::placeholders::_1)))();