میشه با استفاده از varidic template کاری که میخواهید رو انجام داد ولی نوشتن تابع مربوط به print به این شکل کار درستی نیست به این دلیل که printf فقط برای ورودی های از پیش تعیین شده کار می کنه . و هر بار که یک کلاس مینویسد مجبور میشید کد این تابع رو تغییر بدید !
بجای این روش میشه برای کلاس یا فیلد یا هرچیزی که نیاز دارید یک operator<< با ورودی ostream بنویسید به این شکل میشه با استفاده از cout کلاس رو چاپ کرد (یا حتی بدون تغییر کد میشه کلاس رو داخل یک فایل بوسیله fstream نوشت )
مثلا برای وکتور :
#include <iostream>
#include <vector>
#include <string>
template <class T>
std::ostream& operator<<(std::ostream& stream, const std::vector<T>& vec) {
for (int i = 0; i < vec.size(); i++) {
stream << vec[i] << ' ';
}
stream << '\n';
return stream;
}
int main() {
std::cout << std::vector<int>{1, 2, 3};
std::cout << std::vector<std::string>{"ab","cd","ee"};
}
برای کلاس هایی هم که ساختید به همین شکل میشه داخل فایل هدر مربوط به کلاس این تابع رو هم نوشت :
#include <iostream>
#include <fstream>
#include <vector>
class Test
{
public:
Test(int a, int b) :var1_(a), var2_(b){}
friend std::ostream& operator<<(std::ostream& stream, const Test& t);
private:
int var1_;
int var2_;
};
std::ostream& operator<<(std::ostream& stream, const Test& t){
std::cout << "A : var1_ is : " << t.var1_ << " var2_ is : " << t.var2_ << '\n';
return stream;
}
int main()
{
Test t(5, 77);
std::ofstream file("test.txt");
file << t;//chap dar file
std::cout << t;
}
مثال هایی این جا هم هست : نحوه نوشتن کلاس بوسیله cout