私はテンプレートを持っていSoundRecording.h
ます:
template <typename T>
class SoundRecording {
public:
explicit SoundRecording(T init);
private:
T data;
};
template <typename T>
SoundRecording<T>::SoundRecording(T init){
data = init;
}
そして、このテンプレートクラスのインスタンスを次のように作成できます。
SoundRecording<int16_t> recording(INT16_MAX);
に変換するrecording
ための最良の方法は何SoundRecording<float>
ですか?
簡単な方法を使用できることはわかっています。たとえば、次のように宣言できます。
SoundRecording<float> convertInt16ToFloat(SoundRecording<int16_t> input)
しかし、代入演算子またはコンストラクター演算子を使用してこれを実現するためのより洗練された方法があるかどうか疑問に思いました。
次のコメントを更新しました:明示的な変換を定義しようとしています。上記の例でrecording.data
はINT16_MAX
、構築後と同じです。に変換された後は、float
に等しくなり1.0F
ます。
次のようなテンプレート化された変換演算子を使用できます
template<class U>
explicit operator SoundRecording<U>() { /*do the conversion here*/ }
テクニックを例示する最小限のコードスニペット:
template<class T>
struct X
{
template<class U>
explicit operator X<U>() {return {};}
};
int main()
{
X<int> x;
auto y = static_cast<X<float>>(x); // conversion
}
@Mooing Duckがコメントで述べているようexplicit
に、厄介な不要なコンパイラトリガー変換を回避するように変換演算子をマークするようにしてください。
次のように、との組み合わせを使用して、T
がに変換U
可能である場合、またはその逆の場合にのみ、もう少し進んで変換を有効にすることができます。std::enable_if
std::is_convertible
template<class U,
typename std::enable_if<std::is_convertible<T, U>::value>::type* = nullptr>
explicit operator X<U>() {return {};}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加