簡體   English   中英

如何在std :: bind中使用模板函數參數?

[英]How to use template function parameter in std::bind?

我正在嘗試創建一個並行的功能。 我正在使用SFML的線程和std :: bind與模板。

這是我嘗試過的。

#include <SFML/System.hpp>

#include <iostream>
#include <functional>
sf::Mutex mutex;

template <typename F>
void For_Multitread(F Function, std::vector<int>& A);

template <typename F>
void Execute_For(F Function, std::vector<int>& A, int Depart, int Fin);
void Compute(int& Number);

template <typename F>
void For_Multitread(F Function, std::vector<int>& A)
{
    for (int Thread = 0; Thread < 2; Thread++)
    {
        sf::Thread thread(std::bind(&Execute_For, Function, A, Thread * 5, (Thread+1)*5));
        thread.launch();
    }

    mutex.lock();

    for (int i = 0; i < 10; ++i)
        std::cout << A[i] << std::endl;

    mutex.unlock();
}

template <typename F>
void Execute_For(F Function, std::vector<int>& A, int Depart, int Fin)
{
    for (int i = Depart; i < Fin; ++i)
    {
        Function(A[i]);
    }
}

void Compute(int& Number)
{
    Number++;
}

int main()
{
    std::vector<int> A;
    for (int i =0; i < 10; i++)
        A.push_back(i);

    For_Multitread(&Compute, A);

    return 0;
}

錯誤是

no matching function for call to 'bind(<unresolved overloaded function type>, void (*&)(int&), std::vector<int>&, int, int)

我錯過了真正重要的事情嗎?

Execute_For是一個函數模板 ,因此您需要為其提供類型模板參數:

std::bind(&Execute_For<F>, Function, A, Thread * 5, (Thread+1)*5)
//        ~~~~~~~~~~~~~~^            

或使用static_cast

std::bind(static_cast<void(*)(F,std::vector<int>&,int,int)>(&Execute_For), Function, A, Thread * 5, (Thread+1)*5)
//        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM