我有这堂课:
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 ++做事我以前认为不可能。
更新
答案 0 :(得分:7)
您可以查看使用__COUNTER__
宏,它是一个编译器扩展(但GCC和MSVC支持)。请注意,__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为您完成这项工作。