Есть ли способ создать новый тип, похожий на один из базовых типов (например, char), и может быть неявно преобразован между ними, но будет по-разному разрешаться в шаблонах, так что, например, работает следующий код?
typedef char utf8;
template<typename T>void f(T c);
template<> void f<char>(char c)
{
std::cout << "ascii " << c << std::endl;
}
template<> void f<utf8>(utf8 c)//error C2766: explicit specialization; 'void f<char>(char)' has already been defined
{
std::cout << "utf8 " << c << std::endl;
}
int main()
{
char c1 = 'x';
utf8 c2 = 'g';
f(c1);
f(c2);
}
Я думаю, что это может быть возможно с классом, содержащим один элемент данных, если да, то каков самый чистый способ сделать это, и смогут ли компиляторы оптимизировать его, как если бы он был примитивным.
РЕДАКТИРОВАТЬ: я попробовал BOOST_STRONG_TYPEDEF, и это, кажется, работает для основных вещей, но как я могу затем создать std::basic_string из нового типа?
BOOST_STRONG_TYPEDEF(char,utf8);
//first try
BOOST_STRONG_TYPEDEF(std::string,utf8_string);
//second try
typedef std::basic_string<utf8, std::char_traits<utf8>,std::allocator<utf8> > uft8_string;
Первый на самом деле не работает, потому что результирующий тип все еще ожидает char для всех своих методов, а второму, похоже, не нравится наличие конструкторов и операторов присваивания :(
Я еще не пробовал другой способ создать новый тип char, сможет ли он обойти это, если я не могу использовать BOOST_STRONG_TYPEDEF?