1. ホーム
  2. c++

[解決済み] C++で条件付きtypedefを作成する方法

2023-03-01 20:42:39

質問

このようなことをしようとしています。

#include <iostream>
#include <random>

typedef int Integer;

#if sizeof(Integer) <= 4
    typedef std::mt19937     Engine;
#else
    typedef std::mt19937_64  Engine;
#endif

int main()
{
    std::cout << sizeof(Integer) << std::endl;
    return 0;
}

と入力しても、こんなエラーが出ます。

error: missing binary operator before token "("

条件付きのtypedefを正しく作るにはどうしたらよいでしょうか?

どのように解決するのですか?

この場合 std::conditional メタ関数を使用します。

#include <type_traits>  //include this

typedef std::conditional<sizeof(int) <= 4,
                         std::mt19937,
                         std::mt19937_64>::type Engine;

で使用する型が sizeof がテンプレート・パラメータである場合、例えば T であれば typename としてください。

typedef typename std::conditional<sizeof(T) <= 4, // T is template parameter
                                  std::mt19937,
                                  std::mt19937_64>::type Engine;

あるいは Engine に依存する T として

template<typename T>
using Engine = typename std::conditional<sizeof(T) <= 4, 
                                         std::mt19937,
                                         std::mt19937_64>::type;

それは フレキシブル のように使えるようになったからです。

Engine<int>  engine1;
Engine<long> engine2;
Engine<T>    engine3; // where T could be template parameter!