Прикиньте как можно в плюсах:
#include <string>
#include <iostream>
template <typename T> class strange_string {
public:
explicit strange_string(const std::string string) : string_(string) {};
operator std::string() { return string_; };
typedef T tag_type;
private:
std::string string_;
};
struct tag_given_name{};
struct tag_last_name{};
typedef strange_string<tag_given_name> GivenName;
typedef strange_string<tag_last_name> LastName;
void print_name(GivenName name) {
std::cout << "Give name is " << (std::string)name << std::endl;
}
void print_name(LastName name) {
std::cout << "Last name is " << (std::string)name << std::endl;
}
int main(){
strange_string<tag_given_name> x("Masha");
strange_string<tag_last_name> y("Ivanova");
print_name(x);
print_name(y);
//strange_string<tag_given_name> z(std::string("abc")); -- работает
//x = y; -- не работает
//x == y; -- не работает
(std::string)x = (std::string)y; // -- работает
((std::string)x).size(); // -- работает
}
Круто же.