Fir*_*cer 5 c++ templates typedef template-specialization
有没有办法创建一个类似于基本类型之一的新类型(例如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);
}
Run Code Online (Sandbox Code Playgroud)
我认为有可能使用包含单个数据成员的类,如果是这样,最简单的方法是什么,并且编译器能够优化它,就像它是原始的一样.
编辑:我尝试了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;
Run Code Online (Sandbox Code Playgroud)
第一个没有真正起作用,因为结果类型仍然期望其所有方法的char,而第二个似乎不喜欢构造函数和赋值运算符的存在:(
我还没有尝试过另一种方法来创建新的char类型,如果我不能使用BOOST_STRONG_TYPEDEF,它是否可以解决这个问题?