Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么std::bind可以';不是参数包的参数吗?_C++_C++11_Lambda_Functional Programming_Stdbind - Fatal编程技术网

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)))();