0

C ++の初心者として、いくつかの単純な型キャストを書きたいと思います。type new = (type)old接頭辞が括弧付きの形式で使用できるキャストロジックを作成する方法はありますか?

string Text = "Hello";
char* Chars = "Goodbye";
int Integer = 42;

string Message = Text + (string)Integer + (string)Chars + "!";

可能であれば、この構文を使い続けたいと思います。たとえば、boostの文字列キャストにint Number = boost::lexical_cast<int>("Hello World")は、魅力のない長い構文があります。

4

2 に答える 2

2

さまざまなタイプに対してオーバーロードする通常の関数を使用するだけです。

std::string str(int i) {
   return "an integer";
}

std::string str(char* s) {
   return std::string(s);
}

次に、キャストのようではなく、通常の関数呼び出しとして使用します。

string Message = Text + str(Integer) + str(Chars) + "!";
于 2012-08-25T13:23:18.710 に答える
1

NAME<TYPE>(ARGUMENT)のような構文を使用してキャストすることは、C++で最も一般的なことですstatic_cast<int>(char)。ブーストのようにこれを拡張することは理にかなっています。

ただし、非プリミティブ型を変換する場合は、単一の引数とキャスト演算子を使用して非明示的なコンストラクターを使用できます。

class MyType {
  public:
    MyType(int); // cast from int
    operator int() const; // cast to int
};

既存のタイプを扱っている場合、これは不可能です。

Cスタイルのキャストの動作を変更することはできません。C ++は、そのようなキャストをどのように解釈するかを決定します。

ただし、構文を短縮する中間型を思い付くことができます。

template <typename From>
struct Cast {
  From from;
  Cast(From const& from) : from(from) {}
  template <typename To>
  operator To() const {
    return convert(from,To());
  }
};

template <typename From>
Cast<From> cast(From const& from) {
  return Cast<From>(from);
};

std::string convert(int, std::string const&);

これにより、物事を明示的に変換できますが、正確に次のことを述べる必要はありません。

int i = 7;
std::string s = cast(i);
于 2012-08-25T13:23:06.510 に答える