5

私はこのクラスを持っています:

template <typename T, uint64_t N>
struct Probe {
  static const uint64_t Counter = N;
  typedef T Type;
};

私が利用するもの:

typedef Probe <int, 0> FirstIntProbe;
typedef Probe <int, 1> SecondIntProbe;
typedef Probe <float, 2> FloatProbe;

次のような2番目のパラメーターを指定せずに、このクラスをインスタンス化できるコンパイル時\マクロメソッドを作成することは可能ですか?

typedef Probe <int, Something?> FirstIntProbe;
typedef Probe <int, Something?> SecondIntProbe;
typedef Probe <float, Something?> FloatProbe;

これは不可能だと思いますが、C ++で人々が何かをしているのを見たことがありますが、これまでは不可能だったと思います。


アップデート:

  • 1つ増やす必要はありません。重要なのは、すべてのプローブに独自の番号があることだけです。
  • 異なる.cppファイル\変換ユニット間で一意の番号を持つ必要はありません。
4

3 に答える 3

8

__COUNTER__コンパイラ拡張であるマクロの使用を調べることができます(ただし、 GCCMSVCなどでサポートされています)。__COUNTER__これは、翻訳単位ごと、つまり.cppファイルごとにのみ一意であることに注意してください。

編集:複数の翻訳単位にヘッダーを含めても問題ありません。この例は、リンクして完全に正常に実行されます(GCC 4.5で構築)。

probe.h

template <typename T, int N>
struct Probe {
    typedef T Type;
};

#define DECLARE_PROBE(type) typedef struct Probe<type, __COUNTER__>

main.cpp

#include "test.h"

DECLARE_PROBE(int) intprobe;
DECLARE_PROBE(float) floatprobe;

int main(int argc, char** argv) {
    intprobe ip;
    floatprobe fp;
    return 0;
}

test.cpp

#include "test.h"

DECLARE_PROBE(int) intprobe;
DECLARE_PROBE(float) floatprobe;

static intprobe ip;
static floatprobe fp;
于 2013-01-28T10:38:30.207 に答える
5

積分定数式が必要ない場合(つまり、配列などの次元として使用していない場合)は、実際には非常に簡単です。カウンターにグローバル静的を使用する(またはテンプレート化されていない基本クラスに配置する)だけです。 Counter)、初期化で使用するたびにインクリメントします。何かのようなもの:

int currentProbeCounter;

template <typename T>
struct Probe
{
    static int const counter;
    //  ...
};

template <typename T>
const int Probe<T>::counter = ++ currentProbeCounter;

Probe<T>::counterこれは、特定のタイプを使用する場合(または使用する場合)にのみ割り当てられることに注意してください。Probe作成を確実にするために、(必要がない場合でも)のコンストラクターで使用することをお勧めします。(一方、使用したことがない場合は、作成されていないかどうかを気にします。)

于 2013-01-28T11:08:45.437 に答える
0

Boost.Preprocessorを使用して、その作業を行うことができます。

于 2013-01-28T12:10:35.603 に答える