创建一个新的基本类型

时间:2009-10-15 13:36:21

标签: c++ templates typedef template-specialization

有没有办法创建一个类似于基本类型之一的新类型(例如char),并且可以在它们之间进行有意义的转换,但是会在模板中进行不同的解析,例如,以下代码可以工作? / p>

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,它是否可以解决这个问题?

3 个答案:

答案 0 :(得分:8)

C ++作者Matthew Wilson称你所描述的是“真正的typedef”。它们被实现为包含单个数据成员的类(就像你说的那样)。他描述了这些内容,并在chapter 18Imperfect C++(顺便说一句好书)和{i>博士的this article中提供了模板实现。 Dobb的日记。

关于优化,任何好的编译器都应该能够将它优化为基元(因为STL的大部分,例如,依赖于这样的高质量优化),但我没有任何细节。

答案 1 :(得分:4)

我听说有传言说C ++ 0x会带来强大的typedef,这样可以让你的case中的utf8类与char区分开来,但目前还不存在。也许Boost的strong typedef会有所帮助,但我不知道。

答案 2 :(得分:0)

这里的问题是typedef并没有真正定义新类型(比如说Ada,你可以在其中定义互不可复制的整数类型),只是现有的类型的别名。

我相信下一版C ++的提议之一将包括正确的类型。

相关问题