用原始类型替换模板 class
Replacing template class by primitive types
我正在尝试编写一个简单的编译时维度分析库。我想创建一个编译选项来删除库所做的一切而不更改代码。所以基本上我制作了我自己的原始类型版本,如果选择了该选项,我想用实际的原始类型替换它们。
这是代码的最小工作示例
#include <iostream>
#include <stdint.h>
#define DEBUG
#ifdef DEBUG
template<int lenght, int time, int mass, int charge, int temperature, int amount, int intensity>
struct Dimensions {
static const int64_t LENGHT = lenght;
static const int64_t TIME = time;
static const int64_t MASS = mass;
static const int64_t CHARGE = charge;
static const int64_t TEMPERATURE = temperature;
static const int64_t AMOUNT = amount;
static const int64_t INTENSITY = intensity;
};
typedef Dimensions< 0, 0, 0, 0, 0, 0, 0 > Adimensional;
typedef Dimensions< 1, 0, 0, 0, 0, 0, 0 > Length;
typedef Dimensions< 0, 1, 0, 0, 0, 0, 0 > Time;
template<typename Dims> class Int32 {
private:
int32_t m_value;
public:
inline Int32() : m_value(0) {}
inline Int32(int32_t value) : m_value(value) {}
inline int32_t value() {
return m_value;
}
};
template<typename Dims>
Int32<Dims> inline operator+(Int32<Dims> &lhs, Int32<Dims> &rhs) {
return Int32<Dims>(lhs.value() + rhs.value());
}
struct Unmatched_dimensions_between_operands;
template<typename DimsLhs, typename DimsRhs>
Unmatched_dimensions_between_operands inline operator+(Int32<DimsLhs> &lhs, Int32<DimsRhs> &rhs);
#else
template<typename Dims> using Int32<Dims> = std::int32_t;
#endif
int main(int argc, char* argv[]) {
Int32<Time> a = 2;
Int32<Time> b = 5;
std::cout << (a + b).value() << "\n";
return 0;
}
当我删除 #define DEBUG
行时出现编译错误
Error C2988 unrecognizable template declaration/definition 59
是否有合适的方法将代码中 Int32
的任何模板版本替换为原始类型?
尝试:
template<typename Dims> using Int32 = std::int32_t;
您还需要以某种方式定义 Time
(可能还有 Adimensional
和 Length
)(不管如何定义,因为从未使用过模板参数)。
编辑:您的程序仍然不会 运行,因为您正在访问 Int32
的成员 value
,当然 std::int32_t
中不存在。不过,我希望这能让您走上正轨。
我正在尝试编写一个简单的编译时维度分析库。我想创建一个编译选项来删除库所做的一切而不更改代码。所以基本上我制作了我自己的原始类型版本,如果选择了该选项,我想用实际的原始类型替换它们。
这是代码的最小工作示例
#include <iostream>
#include <stdint.h>
#define DEBUG
#ifdef DEBUG
template<int lenght, int time, int mass, int charge, int temperature, int amount, int intensity>
struct Dimensions {
static const int64_t LENGHT = lenght;
static const int64_t TIME = time;
static const int64_t MASS = mass;
static const int64_t CHARGE = charge;
static const int64_t TEMPERATURE = temperature;
static const int64_t AMOUNT = amount;
static const int64_t INTENSITY = intensity;
};
typedef Dimensions< 0, 0, 0, 0, 0, 0, 0 > Adimensional;
typedef Dimensions< 1, 0, 0, 0, 0, 0, 0 > Length;
typedef Dimensions< 0, 1, 0, 0, 0, 0, 0 > Time;
template<typename Dims> class Int32 {
private:
int32_t m_value;
public:
inline Int32() : m_value(0) {}
inline Int32(int32_t value) : m_value(value) {}
inline int32_t value() {
return m_value;
}
};
template<typename Dims>
Int32<Dims> inline operator+(Int32<Dims> &lhs, Int32<Dims> &rhs) {
return Int32<Dims>(lhs.value() + rhs.value());
}
struct Unmatched_dimensions_between_operands;
template<typename DimsLhs, typename DimsRhs>
Unmatched_dimensions_between_operands inline operator+(Int32<DimsLhs> &lhs, Int32<DimsRhs> &rhs);
#else
template<typename Dims> using Int32<Dims> = std::int32_t;
#endif
int main(int argc, char* argv[]) {
Int32<Time> a = 2;
Int32<Time> b = 5;
std::cout << (a + b).value() << "\n";
return 0;
}
当我删除 #define DEBUG
行时出现编译错误
Error C2988 unrecognizable template declaration/definition 59
是否有合适的方法将代码中 Int32
的任何模板版本替换为原始类型?
尝试:
template<typename Dims> using Int32 = std::int32_t;
您还需要以某种方式定义 Time
(可能还有 Adimensional
和 Length
)(不管如何定义,因为从未使用过模板参数)。
编辑:您的程序仍然不会 运行,因为您正在访问 Int32
的成员 value
,当然 std::int32_t
中不存在。不过,我希望这能让您走上正轨。