C ++ theme theme template

I am trying to call a member function of an object using a thread.

If the function does not have a variational pattern (Args ... args), there is no problem, it works:

Consider two classes:

GeneticEngine

template <class T> class GeneticEngine { template <typename ... Args> T* run_while(bool (*f)(const T&),const int size_enf,Args& ... args) { std::thread(&GeneticThread<T>::func,islands[0],f,size_enf); /* Some code */ return /* ... */ } private: GeneticThread<T>** islands; } 

GeneticThread

 template <class T> class GeneticThread { void func(bool (*f)(const T&),const int size_enf) { /* Some code */ }; } 

This is normal.


Now I am adding a variation pattern to the same functions:

GeneticEngine

 template <class T> class GeneticEngine { template <typename ... Args> T* run_while(bool (*f)(const T&,Args& ...),const int size_enf,Args& ... args) { std::thread(&GeneticThread<T>::func,islands[0],f,size_enf,args ...); /* Other code ... */ } private: GeneticThread<T>** islands; } 

GeneticThread

 template <class T> class GeneticThread { template <typename ... Args> void func(bool (*f)(const T&,Args& ...), const int size_enf, Args& ... args) { /* Code ... */ }; } 

GCC does not compile with this code: (sorry for this error message)

 g++ main.cpp GeneticEngine.hpp GeneticThread.hpp Individu.hpp GeneticThread.o -g -std=c++0x -o main.exe In file included from main.cpp:2:0: GeneticEngine.hpp: In instantiation of 'T* GeneticEngine<T>::run_while(bool (*)(const T&, Args& ...), int, Args& ...) [with Args = {}; T = Individu]': main.cpp:24:78: required from here GeneticEngine.hpp:20:13: erreur: no matching function for call to 'std::thread::thread(<unresolved overloaded function type>, GeneticThread<Individu>*&, bool (*&)(const Individu&), const int&)' GeneticEngine.hpp:20:13: note: candidates are: In file included from GeneticThread.hpp:14:0, from GeneticEngine.hpp:4, from main.cpp:2: /usr/include/c++/4.7/thread:131:7: note: template<class _Callable, class ... _Args> std::thread::thread(_Callable&&, _Args&& ...) /usr/include/c++/4.7/thread:131:7: note: template argument deduction/substitution failed: In file included from main.cpp:2:0: GeneticEngine.hpp:20:13: note: couldn't deduce template parameter '_Callable' In file included from GeneticThread.hpp:14:0, from GeneticEngine.hpp:4, from main.cpp:2: /usr/include/c++/4.7/thread:126:5: note: std::thread::thread(std::thread&&) /usr/include/c++/4.7/thread:126:5: note: candidate expects 1 argument, 4 provided /usr/include/c++/4.7/thread:122:5: note: std::thread::thread() /usr/include/c++/4.7/thread:122:5: note: candidate expects 0 arguments, 4 provided 

I really don't understand why this difference makes this mistake. And I can’t fix it.


In both, main.cpp looks like this:

 /* Individu is another class */ int pop_size = 1000; int pop_child = pop_size*0.75; GeneticEngine<Individu> engine(/*args to constructor*/); bool (*stop)(const Individu&) = [](const Individu& best){ return false; }; Individu* best = engine.run_while(stop,pop_child); 

I use: "gcc version 4.7.2 (Ubuntu / Linaro 4.7.2-2ubuntu1)"


I tried:

 std::thread(&GeneticThread<T>::func<Args...>, islands[0], f, size_enf, args ...); 

Now I have one more error:

 GeneticEngine.hpp: In member function 'T* GeneticEngine<T>::run_while(bool (*)(const T&, Args& ...), int, Args& ...)': GeneticEngine.hpp:20:53: erreur: expansion pattern '((& GeneticThread<T>::func) < <expression error>)' contains no argument packs GeneticEngine.hpp:20:24: erreur: expected primary-expression before '(' token GeneticEngine.hpp:20:53: erreur: expected primary-expression before '...' token template <typename ... Args> T* run_while(bool (*f)(const T&,Args& ...), const int size_enf, Args& ... args) { void (GeneticThread<T>::*ptm)(bool (*)(T const&, Args&...), int, Args&...) = &GeneticThread<T>::func; std::thread(ptm, islands[0], f, size_enf, args ...); } 
+6
source share
1 answer

Try:

 std::thread(&GeneticThread<T>::func<Args...>, islands... 

func now a template function. You must specify its template parameters in order to be able to accept its address.

+3
source

Source: https://habr.com/ru/post/944398/


All Articles