我有一个类型和一个模板类
#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让预处理器来处理混合动力应该是什么。
然而,由于Time类中的hybrid = double,代码完美地编译了if hybrid = __float128,但没有编译多少,如果是hybrid = __float128的话。
是否有解决办法来定义别名,如
using long __float128 = float128;在定义longHybrid时,我有了一个解决办法,比如:
#ifdef USE_QUAD
using hybrid = __float128;
using longHybrid = __float128;
#else
using hybrid = double;
using longHybrid = long double;
#endif但是转发两个模板参数会影响一些代码,并且感觉有些多余。我很想听听你的想法。
发布于 2021-12-10 02:31:43
当long T是double时,您不能实际编写T并期望它被解释为double。如果它适用于您,这是您的编译器的一个不可移植的怪癖。
如果您想要一种类型的“常规”和“长”版本,对于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。
https://stackoverflow.com/questions/70289221
复制相似问题