Игнорировать спецификатор 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.

Другие вопросы по тегам