未知の型に暗黙的に変換することはできません。変換演算子は静的でないメンバ関数でなければなりませんが、それでもクラスをラップする必要があります。未知の型(テンプレート化されたコンストラクタとも呼ばれる)から変換コンストラクタを記述します。
あなたはそれフリー機能したくない理由:その後、
template<typename To, typename From>
std::pair<To, To> convert(const std::pair<From, From>& p){
return std::make_pair(static_cast<To>(p.first),
static_cast<To>(p.second));
}
など、それを呼び出す:
std::pair<float, float> mp{3.424, 59.35};
auto p2 = convert<double>(mp);
それができるようちょうど約として明らかです。参照してください。それLive on Coliru
EDIT
(OPさんのコメントを1として):
template<typename T>
class Point{
public:
T x = T{};
T y = T{};
template<typename Y>
Point(Point<Y> p) :
x(static_cast<T>(p.x)),
y(static_cast<T>(p.y))
{ }
Point(T x_val, T y_val) : x(x_val), y(y_val)
{ }
Point(Point&&) = default;
Point(const Point&) = default;
Point& operator = (Point&&) = default;
Point& operator = (const Point&) = default;
};
double
を使用してこの機能を考えてみましょう:
あなたはそういったことのための迅速なタイプを行うことができます型パラメータとしてPoint
:
void print(Point<double> p){
std::cout << "(" << p.x << ", " << p.y << ")\n";
}
以下のステートメントは、すべてコンバーターコンストラクターのために機能します。
int main() {
Point<float> mp{4.535, 395.3};
Point<int> ip = mp;
print(mp);
print(ip);
return 0;
}
あなたがあなた自身のペア宣言することがあり、それはLive on Coliru
番号を参照してください:double_point2d、float_point2d、int_point2dをし、適切な変換を提供しています。 (ここではテンプレートと考えるかもしれません) –
変換関数は引数をとりません。あなたはそれを通常の(おそらく静的な)メンバ関数にすることができます。 – 0x499602D2
ラッパーの代替手段は 'pair'から派生することですが、それを行うことにも多くの問題があります。私はあなたの演算子はメンバ関数としても暗黙的に動作しないと思います。なぜなら、戻り型のテンプレートパラメータは関数の引数から推論できないからです(暗黙的に 'static_cast' 'T = pair ' 。最後に、暗黙的なキャストは通常は読みやすさを低下させるので、関数として保持する方がいいです( 'static_cast'を意味する場合を除いて)。 –