c++ - 创建新的原始类型

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

我在想一个包含单个数据成员的类可能是可行的,如果是的话,最干净的方法是什么,编译器是否能够像原始数据一样对其进行优化。

编辑:我尝试了 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,它能解决这个问题吗?

最佳答案

C++ 作者 Matthew Wilson 称您所描述的为“真正的类型定义”。它们被实现为一个包含单个数据成员的类(就像你说的)。他描述了它们并在 chapter 18 中提供了一个模板实现。的 Imperfect C++ (顺便说一句,好书)和this article博士。多布的日记

关于优化,任何优秀的编译器都应该能够将其作为原语进行优化(因为例如,STL 的大部分内容都依赖于像这样的高质量优化),但我没有任何具体细节。

关于c++ - 创建新的原始类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1572420/

相关文章:

c++ - Windbg:ChildEBP和RetAddr的含义

c++ - 具有重载方法的可变数据结构

c++ - C++ 中函数指针 typedef 的声明

c++ - 我想扩展 std::string,但不是出于你可能认为的原因

c++ - VHDL DFF 代码的简单 C++ 包装器

c++ - 在 CRTP 中使用嵌套名称说明符

c++ - 尝试模拟 SystemC 文件时出现 "multiple definition of"消息

c++ - 成员类实例化

c++ - 持有泛型类型的实例 - C++

c++ - typedef 模板类错误