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);