4

範囲指定された列挙型が使いにくいことがますますわかっています。参照によって値を設定/初期化するスコープ列挙型のテンプレートを含む一連の関数オーバーロードを作成しようとしています--次のようなものです:

void set_value(int& val);
void set_value(double& val);
template <typename ENUM> set_value(ENUM& val);

set_valueただし、複数の一時的な値を導入せずにテンプレート化されたバージョンを記述する方法がよくわかりません。

template <typename ENUM>
set_value(ENUM& val)
{
  std::underlying_type_t<ENUM> raw_val;
  set_value(raw_val);    // Calls the appropriate "primitive" overload
  val = static_cast<ENUM>(raw_val);
}

static_castはに加えて 2 番目の一時的な値を導入すると思いますraw_val。これらのいずれかまたは両方がコンパイラによって最適化される可能性があると思いますが、いずれにせよ、set_value呼び出しは一時的な値も生成するため (インライン化されていないと仮定して)、パフォーマンスの点で大きな違いはありませんが、これはまだエレガントではないようです。私がやりたいことは次のようなものです

template <typename ENUM>
set_value(ENUM& val)
{
  set_value(static_cast<std::underlying_type_t<ENUM>&>(val));
}

...しかし、これは有効ではありません (また、参照の代わりにポインターを直接使用する対応するコードもありません)。

を使用することもできましたがreinterpret_cast、これはいくつかの予備テストから機能しているように見えます (機能しない理由は思いつきません) が、C++ では眉をひそめているようです。

これを行う「標準的な」方法はありますか?

4

1 に答える 1