Замена класса шаблона примитивными типами

Я пытаюсь написать простую библиотеку анализа времени компиляции. Я хочу создать опцию компиляции, чтобы удалить все, что делает библиотека без изменения кода. По сути, я сделал свою собственную версию примитивных типов и хочу заменить их фактическими примитивными типами, если выбрана эта опция.

Это минимальный рабочий пример кода

#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 в коде с примитивным типом?

0

Решение

Пытаться:

template<typename Dims> using Int32 = std::int32_t;

Также вам нужно определить Time (и, вероятно, Adimensional а также Length) как-то (неважно как, так как аргумент шаблона никогда не используется).

Изменить: Ваша программа по-прежнему не будет работать, как ваш доступ к члену value из Int32 чего, конечно, нет в std::int32_t, Однако я надеюсь, что это поставит вас на правильный путь.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]