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;

是否可以创建一个编译时间\宏方法,它允许我在不指定第二个参数的情况下实例化此类,例如:

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

我认为这是不可能的,但是我又一次看到人们用 C++ 做我以前认为不可能的事情。


更新:

  • 不需要加一,重要的是每个探针都有自己的编号。
  • 不需要在不同的 .cpp 文件\翻译单元中具有唯一编号。
4

3 回答 3

8

您可以考虑使用__COUNTER__宏,它是一个编译器扩展(但在GCCMSVC等上受支持)。请注意,只有每个翻译单元(即每个文件__COUNTER__)是唯一的。.cpp

编辑:在多个翻译单元中包含标题是可以的。此示例链接并运行得非常好(基于 GCC 4.5):

探针.h

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

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

主.cpp

#include "test.h"

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

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

测试.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 回答