【问题标题】:Creating a new primitive type创建新的原始类型
【发布时间】:2009-10-15 13:36:21
【问题描述】:

有没有一种方法可以创建一个类似于基本类型之一的新类型(例如 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 是否能够解决这个问题?

【问题讨论】:

  • 你的计划中的缺陷是尽管它的名字 UTF-8 不是 8 位宽。它是从 8 位到 32 位的可变宽度。因此,单个 char 只能表示 UTF-8 的一小部分(实际上是 128 个字符的 ASCII 子集)。
  • 这就是为什么我想要可以使用不同模板特化和重载的类型,以便它将使用考虑到 UTF-8(和 UTF-16)可能使用的事实的方法版本单个字符的多个元素。

标签: c++ templates typedef template-specialization


【解决方案1】:

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

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

【讨论】:

  • 真; std::vector&lt;T&gt; 迭代器是 T* 的瘦包装器,一个好的优化器需要处理它。
【解决方案2】:

我听说 C++0x 将带来强大的 typedef,这将允许您的案例中的 utf8 类与 char 区分开来,但目前不存在。也许 Boost 的 strong typedef 会有所帮助,但我不知道。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-02-27
      • 2016-06-16
      • 2011-01-30
      • 2017-07-08
      • 2014-07-06
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 2017-03-29
      相关资源
      最近更新 更多