Criando um novo tipo primitivo

Existe uma maneira de criar um novo tipo que é como um dos tipos básicos (por exemplo, char), e pode ser implcitamente convertido entre, mas será resolvido de forma diferente em modelos, de modo que, por exemplo, o código a seguir funciona?

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);
}

Eu estou pensando que isso pode ser possível com uma classe contendo um único membro de dados, em caso afirmativo, qual é a maneira mais limpa de fazê-lo, e os compiladores serão capazes de otimizá-lo como se fosse um primitivo.

EDIT: eu tentei BOOST_STRONG_TYPEDEF, e que parece funcionar para coisas básicas, mas como posso então ir para criar um std :: basic_string do novo tipo?

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;

O primeiro não funciona realmente porque o tipo resultante ainda espera char para todos os seus métodos, e o segundo não parece gostar da presença de construtores e operadores de atribuição :(

Eu não tentei a outra maneira de criar o novo tipo char ainda, será capaz de contornar isso se eu não puder com BOOST_STRONG_TYPEDEF?

questionAnswers(3)

yourAnswerToTheQuestion