记录一个关于universal reference, 我犯下的滔天大错。

错误描述:
	#ifndef LINKQ_GDL_H
	#define LINKQ_GDL_H
	
	#include
	#include
	#include
	#include
	#include
	namespace gdl {
	
		template
		class Task;
	
		//特化一个Task
		template
		class Task {
		
		public:
			using value_type = std::function;
	
		public:
			Task(value_type&& f) : m_func(std::move(f)) {}
			Task(value_type& f) :m_func(f) {}
	
			
			R Run(Args&&... args) {
				return m_func(std::forward(args)...);	//完美转发.
			}
	
			template
			auto Then(F&& f)->Task::type(Args...)>
			{
				using RetType = typename std::result_of::type;
	
				auto func = std::move(m_func);
				return Task([f, func](Args&& ... args) {
					return f(func(std::forward(args)...));
					});
			}
	
			void reset(value_type&& func) {
				m_func = std::move(func);
			}
	
			void reset(value_type& func) {
				m_func = func;
			}
	
	
		private:
			std::function m_func;
	
		};
	
	
	}
	
	
	#endif

void test_task() {


	std::shared_ptr sha_a(new int[10] { 10, 9, 8, 7, 6, 5, 45, 89 });
	//std::shared_ptr arr ( new int[10] { 10, 9, 8, 7, 6, 5, 45, 89 });

	gdl::Task(std::shared_ptr, size_t)> task([](std::shared_ptr arr, size_t sz) ->std::vector {
		std::vector v;
		for (size_t i = 0; i < sz; i++) {
			if (arr.get()[i] % 2 == 0)
				v.emplace_back(arr.get()[i]);
			}
		return v;
		});


	//auto ret = task.Then([](std::vector v)->std::vector {
	//		std::sort(v.begin(), v.end());
	//		return v;
	//	}).Run(std::move(pa), 10);
	
	auto ret = task.Run(sha_a, 10);
		for (auto e : ret) 
			std::cout << e << " ";
		std::cout << std::endl;
	

}

然后出现一个错误:
记录一个关于universal reference, 我犯下的滔天大错。_第1张图片

错误分析:
aha!
R Run(Args&&... args) {
			return m_func(std::forward(args)...);	//完美转发.
		}
		这里的args怎么就是“std::shared_ptr &&”类型了呢?不是未定引用类型呢?
前面不是有	template吗?, 为啥args就确定是“std::shared_ptr &&”呢?
---
---
---
求思......
--
-
原来在我实例化模板Task的时候:
	gdl::Task(std::shared_ptr, size_t)> task([](std::shared_ptr arr, size_t sz) ->std::vector {
	std::vector v;
	for (size_t i = 0; i < sz; i++) {
		if (arr.get()[i] % 2 == 0)
			v.emplace_back(arr.get()[i]);
		}
	return v;
	});
	这里的模板参数Args已经被确定下来了: Args == std::shared_ptr
	所以Run中的参数类型也就确定了!!!
	自然就不再是universal reference!!!
错误改正:

记录一个关于universal reference, 我犯下的滔天大错。_第2张图片

搞定!!

然后我应当如何避免这一现象的出现呢?
	1.类模板参数在模板实例化时确定,函数模板参数在函数调用时确定
	2.仔细分析错误。

你可能感兴趣的:(c/c++)