在 C++ 中忽略自定义类型的 'long' 说明符

Ignore 'long' specifier for custom type in c++

我有类型和模板class

#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;
};

并使事情变得复杂:嵌套 class

template<typename T>
struct State {
    Time<T> time;
    std::vector<T> position;
}

现在我想在我的代码中同时使用 class 作为 hybriddouble,比如

State<hybrid> stateH; // sometimes precision needed
State<double> stateD; // precision never needed

让预处理器处理混合应该是什么。

然而,代码在 hybrid = double 时可以完美编译,但在 hybrid = __float128 时则不那么完美,因为时间 class 中的 long T dayFraction;

是否有解决方法来定义像

这样的别名
using long __float128 = float128;

?

我有一个定义 longHybrid 的解决方法,例如:

#ifdef USE_QUAD
using hybrid     = __float128;
using longHybrid = __float128;
#else
using hybrid     = double;
using longHybrid = long double;
#endif

但是转发两个模板参数会影响一些代码,感觉有点多余。 我很想听听任何想法。

Tdouble 时,您不能实际编写 long T 并期望将其解释为 long double。如果它对你有用,那是你的编译器的一个不可移植的怪癖。

如果您想要一种类型的“常规”和“长”版本,double 不同但 float128 相同,一种方法是定义这样的模板:

template <typename T> struct Longer {
    using type = T;
};
template <> struct Longer<double> {
    using type = long double;
};

而不是 struct Time 中的 long T,使用 typename Longer<T>::type