Создание нового примитивного типа

Есть ли способ создать новый тип, который похож на один из базовых типов (например, 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 для всех своих методов, а второй, похоже, не любит присутствия конструкторов и операторов присваивания :(

Я еще не попробовал другой способ создания нового типа символа, сможет ли он обойти это, если я не смогу с BOOST_STRONG_TYPEDEF?

Ответы на вопрос(3)

Ваш ответ на вопрос