0

我有一个类型和一个模板类

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

现在我想在我的代码中同时使用这个类hybriddouble比如

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

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

然而,代码完美地编译hybrid = double了 if ,但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

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

4

1 回答 1

1

您实际上无法编写long T并期望将其解释为long doublewhen Tis double。如果它适合你,那是你的编译器的一个不可移植的怪癖。

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

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

代替long Tin struct Time,使用typename Longer<T>::type.

于 2021-12-10T02:31:43.843 回答