#include <iostream>
class Person{
public:
template<typename STR>
Person(STR&& n):name(std::forward<STR>(n)) {
std::cout<<"tmpl-conster"<<std::endl;
}
Person(const Person& p):name(p.name){
std::cout<<"copy constructor"<<std::endl;
}
Person(Person&& p): name(std::move(p.name)){
std::cout<<"move constructor"<<std::endl;
}
private:
std::string name;
};
void Test(){
std::string str="hello";
Person p(str);
Person p1("tmp");
Person p2(std::move(p1));
}
template<typename T>
using EnableIfString = typename std::enable_if<std::is_convertible<T, std::string>::value>::type;
class Person1{
public:
template<typename STR, typename=EnableIfString<STR>>
Person1(STR&& n):name(std::forward<STR>(n)) {
std::cout<<"tmpl-conster"<<std::endl;
}
Person1(const Person1& p):name(p.name){
std::cout<<"copy constructor"<<std::endl;
}
Person1(Person1&& p): name(std::move(p.name)){
std::cout<<"move constructor"<<std::endl;
}
private:
std::string name;
};
void Test1(){
Person1 p("tmp");
Person1 p1(p);
}
int main(){
Test();
Test1();
}