5

基本型の 1 つ (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 を期待しているため、最初のものは実際には機能しません.2番目のものは、コンストラクターと代入演算子の存在を好まないようです:(

新しい char 型を作成する他の方法はまだ試していませんが、BOOST_STRONG_TYPEDEF を使用できない場合、これを回避できますか?

4

3 に答える 3

8

C++ の作者である Matthew Wilson は、あなたが説明しているものを「真の typedef」と呼んでいます。それらは、単一のデータメンバーを含むクラスとして実装されています(あなたが言ったように)。彼はそれらについて説明し、Imperfect C++ (ちなみに良い本)の第 18 章とDr. Dobb's Journal のこの記事でテンプレートの実装を提供しています。

最適化に関しては、優れたコンパイラはこれをプリミティブとして最適化できるはずですが (たとえば、STL の大部分はこのような高品質の最適化に依存しているため)、詳細はわかりません。

于 2009-10-15T13:42:07.493 に答える
4

あなたの場合、utf8 クラスを char と区別できるようにする強力な typedef を C++0x がもたらすという噂を聞きましたが、現在は存在しません。Boostの強力なtypedefが役立つかもしれませんが、わかりません。

于 2009-10-15T13:42:14.123 に答える
0

ここでの問題は、typedef が実際には新しい型を定義するのではなく (たとえば、相互に互換性のない整数型を定義できる Ada のように)、既存の型のエイリアスにすぎないことです。

C++ の次のバージョンの提案の 1 つに適切な型が含まれると思います。

于 2009-10-15T13:49:18.897 に答える