Thread overview
C++ templates
May 05, 2018
hsencan
May 05, 2018
fatih (fatih)
May 05, 2018
hsencan
May 05, 2018

Merhabalar,

void test(int x,char y,bool z){

	std::cout << x<<" "<<y<<" "<<z<<std::endl;
}
class MakeThread {
public:
	template<typename callable, typename = std::enable_if<std::is_function<T>::value>,typename... arg>
	static auto run(bool isVoid,callable foo,arg&& ...args)->decltype(callable(std::forward(args))){

		std::function<typename std::result_of<T(arg...)>::type()>task
       (std::bind(std::forward<T>(foo), std::forward<arg>(args)...));

       if (isVoid) {
			std::thread([task]{
				task();

			}).detach();
		}
		else {
			std::future fut= std::async(std::launch::async, task);
			return fut.get();
		}
	}
private:
	/*static std::mutex mtx;
	std::condition_variable cv;
	std::future<bool> fut;
	bool ready;*/
};
int main(){

	MakeThread::run(false,test, 15,'a', true);
}

Burada hatanın ne olduğunu bir türlü anlayamadım. Yardımcı olursanız çok sevinirim :)

Edit: Aldığım Hatayı eklemeyi unumuşum. '"no instance of function template "MakeThread::run" matches the argument list MemoryAlloctor"'

İyi Çalışmalar

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 05, 2018

Kodda bir branchte return olmamasi disinda, iki tane sorun gordum ben:

  1. Template parametresi olarak callable tanimlanmis fakat diger yerlerde T kullanilmis dolayisiyla onlari derleyici bulamiyor.
  2. decltype(...) icindeki std::forward fonksyonuna template argumanlari verilmemis ve parameter pack expand edilmemis. Dogru hali soyle olmali: foo(std::forward<arg>(args)...).

Bunlari duzeltince su kod bende derlendi:

void test(int x,char y,bool z){

   std::cout << x<<" "<<y<<" "<<z<<std::endl;
}
class MakeThread {
public:
   template<typename T, class... arg, class = std::enable_if<std::is_function<T>::value>>
   static auto run(bool isVoid,T foo, arg&& ...args)
           ->decltype(foo(std::forward<arg>(args)...))
   {
       std::function<typename std::result_of<T(arg...)>::type()>task
       (std::bind(std::forward<T>(foo), std::forward<arg>(args)...));

       if (isVoid) {
           std::thread([task]{
               task();

           }).detach();
       }
       else {
           std::future fut= std::async(std::launch::async, task);
           return fut.get();
       }
   }
private:
   /*static std::mutex mtx;
   std::condition_variable cv;
   std::future<bool> fut;
   bool ready;*/
};
int main(){

   MakeThread::run(false,test, 15,'a', true);
}

Bir tavsiyem isVoid parametresini de template'a cevirerek if'lerden birinin icinde return olmamasi problemini cozmek, zira su an en iyi ihtimalde warning verecek.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 05, 2018

Tahmin: Şablon, if bloğunda return deyimi olmadığından derlenemiyor ve derleyici o yüzden o çağrıya uyan şablon tanımı bulamıyor.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 06, 2018

Yardımlarınız için teşekkürler Bende de sorunsuz çalıştı.

Alıntı (fatih):

>

Bir tavsiyem isVoid parametresini de template'a cevirerek if'lerden birinin icinde return olmamasi problemini cozmek, zira su an en iyi ihtimalde warning verecek.

Ali Hocam da aynı şeyi söyledi. if içinde return olması ne kadar önemli ? Sonuçta scope dışına çıktığında
anlamayıcak mı fonksiyonun bittiğini ?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 07, 2018

Fonksiyonun bittiğini anlayacak ama ne değer döndüreceğine kendisi karar vermeyecek. Bu da çok iyi bir şey çünkü böylece programın her tarafına derleyici tarafından eklenmiş kodların gizlediği hataların peşinde koşmamış oluyoruz.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]