7

#defines を介して多くのコードを生成するレガシー コードを使用しています。#ifdefを の中に入れることはできないことはわかっています#defineが、 は#if可能ですか? 特定のタイプの特殊化を追加したいと思います。(代わりにテンプレートを使用するなどの大きな変更を加えることなく)。次のサンプルでは不可解なエラーが発生するため、これは方法ではありません。

#define MK_GET(type) \
  type get_ ## type (int index) \
  { \
    #if type == double \  <-- what i want to add
      specialized code... \
    #endif
    ...
  } \

MK_GET(double);
MK_GET(int);
MK_GET(string);
4

4 に答える 4

7

テンプレートを使用してそれを実現できます。

template<typename T>
struct getter
{
    T operator()(int index)
    {
        // general code
    }
};

template<>
struct getter<double>
{
    T operator()(int index)
    {
        // specialized code
    }
};

#define CAT(a, b) a ## b
#define MK_GET(type) type CAT(get_, type) (int index) getter<type>()(index)
于 2011-12-08T08:18:56.287 に答える
1

プリプロセッサはワンパス プロセスであるため、マクロ定義内にマクロ定義を配置することはできません。これを行う唯一の方法は、テンプレート インターフェイスを使用することです。

于 2011-12-08T08:20:56.417 に答える
0

なぜあなたはこのようにそれを書かないのですか:

#if (type == double)
    #define MK_GET  some code
#else
    #define MK_GET  same code with changes
#endif
于 2011-12-08T08:16:55.667 に答える
0

#if内にネストすることはできません#definetemplateそれがより良い選択であるのに、なぜ sを避けたいのか。それらは安全で「コンパイル可能」です (前処理されていません)。

于 2011-12-08T08:17:22.997 に答える