通用类的每个实例化都会增加编译时变量

时间:2013-01-28 10:34:01

标签: c++ c++11 generic-programming

我有这堂课:

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文件\翻译单位的数字。

3 个答案:

答案 0 :(得分:7)

您可以查看使用__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;

答案 1 :(得分: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的构造函数中(即使您不需要) 确保它的创建。 (另一方面,如果你从不使用它, 谁在乎它是否从未创造过。)

答案 2 :(得分:0)

您可以使用Boost.Preprocessor为您完成这项工作。