Игнорировать спецификатор long для настраиваемого типа в c++
У меня есть тип и шаблонный класс
#ifdef USE_QUAD
using hybrid = __float128;
#else
using hybrid = double;
#endif
template<typename T>
struct Time {
int day;
long T dayFraction; // This is an example, I need both in here, T and long T;
};
И чтобы все усложнить: класс вложенности
template<typename T>
struct State {
Time<T> time;
std::vector<T> position;
}
Теперь я хочу использовать класс в своем коде как
hybrid
и
double
одновременно, как
State<hybrid> stateH; // sometimes precision needed
State<double> stateD; // precision never needed
и пусть препроцессор позаботится о том, каким должен быть гибрид.
Однако код отлично компилируется, если
hybrid = double
, но не так много, если
hybrid = __float128
, из-за
long T dayFraction;
в классе Time.
Есть ли обходной путь для определения псевдонима, например
using long __float128 = float128;
?
У меня был обходной путь с определением
longHybrid
как:
#ifdef USE_QUAD
using hybrid = __float128;
using longHybrid = __float128;
#else
using hybrid = double;
using longHybrid = long double;
#endif
Но пересылка двух параметров шаблона немного повлияет на код и кажется излишней. Я хотел бы услышать любые идеи.
1 ответ
На самом деле вы не можете написать и ожидать, что это будет интерпретировано как
long double
когда
T
является . Если это работает для вас, это непереносимая особенность вашего компилятора.
Если вам нужны «обычная» и «длинная» версии типа, разные для
double
но то же самое для
float128
, один из способов сделать это — определить такой шаблон:
template <typename T> struct Longer {
using type = T;
};
template <> struct Longer<double> {
using type = long double;
};
Вместо
long T
в
struct Time
, использовать
typename Longer<T>::type
.