راه حل ساده تر برای merge رشته با استفاده از variadic - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

وبـــلاگ هــفت خــط کــد


آموزش های برنامه نویسی
۶۱ نفر آنلاین
۱ عضو و ۶۰ مهمان در سایت حاضرند

راه حل ساده تر برای merge رشته با استفاده از variadic

+1 امتیاز
59 بازدید

سلام به دوستان عزیز.

من با توجه به این پست یک تابع برای merge رشته نوشتم که پارامتر اول separator و مابقی مسیر هستند به صورت زیر :

void mergePath(std::vector<std::string>&){}//end

template <typename T, typename ...Types>
void mergePath(std::vector<std::string>& result, const T& val, const Types& ... args)
{
	result.push_back(val);
	mergePath(result, args ...);
}

template <typename ...Types>
string mergePath(const string& sep, const Types& ... args)
{
	std::vector<std::string> vec_strs;
	mergePath(vec_strs, args ...);
	string result = "";
	if (!vec_strs.size())
		return result;
	result = vec_strs.front();
	for (size_t i = 1; i < vec_strs.size(); i++)
		result += sep + vec_strs[i];
	return result;
}


int _tmain(int argc, _TCHAR* argv[])
{
	cout << mergePath("\\", "C:", "MyFolder", "pictures") << endl;
	return 0;
}

 

حالا سوالی که از دوستان داشتم آیا نمیشه اینکار را در یک تابع انجام داد و چندین تابع ننوشت؟

تو این پست توضیح داده شده ولی متوجه نشدم

سوال شده مرداد 27, 1393  بوسیله ی farnoosh (امتیاز 2,350)   5 12 47

1 پاسخ

+2 امتیاز

به این شکل 

 

#include <iostream>
#include <string>
#include <sstream>

template< typename ... Args >
std::string make_path(const std::string& seperator, Args const& ... args)
{
	std::ostringstream stream;
	using List = int[];
	(void)List{ 0, ((void)(stream << args << seperator), 0) ... };
	return stream.str();
}

int main()
{
	auto s = make_path("\\", "C:", "MyFolder", "pictures");
	std::cout << s << '\n';
}

 

پاسخ داده شده مرداد 27, 1393 بوسیله ی BlueBlade (امتیاز 15,712)   13 16 85
...