#include <iostream>
#include <string>
#include <vector>
void func(){
int a;
double b;
int* ptr;
}
template<typename T>
void func(){
T t;
}
struct MyClass;
template<typename T>
void zero_init() {
T t{};
if (!std::is_same_v<T, MyClass>) {
std::cout<<std::boolalpha<<t<<std::endl;
}
else {
std::cout<<std::boolalpha<<t<<std::endl;
}
}
struct MyClass{
friend std::ostream& operator<<(std::ostream& os, MyClass& c) {
return os<<c.a;
}
int a;
};
void Test(){
zero_init<int>();
zero_init<bool>();
zero_init<nullptr_t>();
zero_init<MyClass>();
}
template<typename T>
struct MyClass1{
MyClass1():t{} {
}
T t;
};
template<typename T>
struct MyClass2{
MyClass2(): t(){}
T t;
};
template<typename T>
struct MyClass3{
T t{};
};
template<typename T>
void func_default(T t = T()){
std::cout<<t<<std::endl;
}
void Test1(){
MyClass1<int> m;
std::cout<<m.t<<std::endl;
MyClass1<int> m1;
std::cout<<m1.t<<std::endl;
MyClass1<int> m2;
std::cout<<m2.t<<std::endl;
func_default<int>();
}
int main()
{
Test();
Test1();
}